java-组合优于继承

组合和继承。都能实现对类的扩展。


差别例如以下表所看到的

组合
继承
has-a关系is-a关系
执行期决定编译期决定
不破坏封装,总体和局部松耦合破坏封装,子类依赖父类
支持扩展,任意添加组合类仅仅能继承一个父类,必须包括全部方法,添加系统复杂性
动态选择组合类方法复用父类方法


以下通过一个样例说明,子类继承必须包括全部父类方法,添加了出错率。改动父类方法会引起全部子类功能变化。

/**
 * 呼叫基类
 * 
 * @author peter_wang
 * @create-time 2014-5-20 下午4:30:33
 */
public class SuperCallClass {

    public void call() {
    }

    public void operate1() {
        System.out.println("operate1 in super class");
    }
    
    public void operate2() {
        System.out.println("operate2 in super class");
    }

    /**
     * 冗余的函数,导致子类臃肿,破坏了封装。添加了出错机会
     */
    public void redundant() {
        System.out.println("redundant in super class");
    }
}

/**
 * 呼叫子类
 * 
 * @author peter_wang
 * @create-time 2014-5-20 下午4:32:22
 */
public class SubCallClass
    extends SuperCallClass {


    @Override
    public void operate1() {
        //破坏了封装。无意中引入了基类方法
        super.operate1();
        System.out.println("operate in sub class");
    }


    @Override
    public void call() {
        super.call();
        operate1();
    }
}

/**
 * 分析继承和组合
 * 
 * @author peter_wang
 * @create-time 2014-5-20 下午4:37:31
 */
public class CallClassDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SubCallClass subCallClass = new SubCallClass();
        subCallClass.operate1();
    }

}

组合类的使用

/**
 * 呼叫组合类
 * 
 * @author peter_wang
 * @create-time 2014-5-20 下午5:11:34
 */
public class CombineCallClass {

    private SuperCallClass mSuperCallClass;

    public CombineCallClass() {
        mSuperCallClass = new SuperCallClass();
    }

    public void operate1() {
        System.out.println("operate in combine class");
    }

    /**
     * 仅仅须要使用到SuperCallClass中的operate2方法
     */
    public void operate2() {
        mSuperCallClass.operate2();
    }

    public void call() {
        operate1();
    }
}



综上概述:

组合通常优于继承。

1.考虑使用多态。能够用继承。
2.考虑复用父类方法,并且父类非常少修改。能够用继承。
其它情况请谨慎使用继承。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值