zoukankan      html  css  js  c++  java
  • 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.考虑复用父类方法,并且父类非常少修改。能够用继承。
    其它情况请谨慎使用继承。




  • 相关阅读:
    SecureCRT设置
    实战c++中的vector系列--知道emplace_back为何优于push_back吗?
    Dalvikvm工具
    智能高速充电
    HTML5标准最终来了,看什么书学习最好??????
    Android平台调用Web Service:线程返回值
    C 多级指针
    C 指向指针的指针
    C 字符串
    C while循环的自增和自减
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6810029.html
Copyright © 2011-2022 走看看