HIT软件构造-继承(LSP)和委托(CRP)

目录

1.继承原则(LSP)

2.委托原则(CRP)


1.继承原则(LSP)

  1. 子类型必须继承父类的所有方法,可以增加方法,但是不能删除方法
  2. 子类型必须继承父类型所有的抽象方法
  3. 子类型重写的方法的返回值类型和父类一样,或者是是父类返回值类型的子类,如果类型一样,则子类的返回值范围更窄,更加具体(协变)
  4. 子类型重写的方法的参数类型必须和父类一样(这里没有什么继承关系),而且子类的参数必须比父类更加广泛(限制条件较小),能处理更多的情况(Java不承认逆变)
  5. 子类型只能抛出父类已经抛出的异常,或者抛出父类抛出异常的子类异常,也可以不抛出异常,也就是说子类抛出的异常比父类范围更小
  6. 子类的规约不能比父类弱(前置条件不能比父类强,后置条件不能比父类弱,不变性(RI)比父类更严格),也就是父类能做的,子类一定也能做
  7. 普通的方法(不是重写的),参数列表中是父类,参数调用时传入子类也是可行的

上面的例子看出:

  1. 子类满足相同的不变量(考虑子类增加的成员变量charge)
  2. 重写的方法 start 具有较弱的前提条件
  3. 重写的方法brake 具有更强的后置条件

特殊情况:

  1. 集合类对象,如果集合中的数据类型不同,则它们是不可能有父子继承关系的,比如ArrayList<Integer>和ArrayList<Number>是没有继承关系的。
  2. 但是如果数据类型相同,则是可能有继承关系的,如HashSet<Integer>是LinkedHashSet<Integer>的父类

                                      

2.委托原则(CRP)

委派/委托:一个对象请求另一个对象的功能,是另一种复用形式,并且,委托是优于继承的。委托发生在object层面,而继承发生在class层面

比如想实现一个普通类的比较方法,可以采用继承和委托两种方式,当子类只需要继承父类的一小部分方法时,使用委托是更方便的(不需要重写很多的方法)

继承 (实现了Comparable接口,并重写compareTo方法)

class A implements Comparable<A>{
    int num;

    public A(int num){
        this.num = num;
    }

    @Override
    public int compareTo(A o){
        return this.num - o.num;
    }
}

委托 (将Comparable接口委托成员变量,并在成员方法compareTo中调用它)

class A{
    int num;

    Comparable<A> comparable = new Comparable<A>(){
        @Override
        public int compareTo(A o){
            return num - o.num;
        }
    };

    public A(int num){
        this.num = num;
    }

    public int compareTo(Comparable<A> comparable, A a){
        return comparable.compareTo(a);
    }
}

总结:尽量少用继承,用委托

有问题欢迎大家指出~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值