【java】论组合和继承

前言:

       在项目开发初期,我们总想着尽可能地收集需求来分析设计,试图来构建一个完美的摩天大厦。但是,需求总是源源不断,这时候我们应该意识到,一个系统,它其实是有“生命”的,会不断的“成长”。由此,作为开发人员,在开发初期应该创建出一个可扩展,可复用,灵活性高,低耦合的代码结构,哪怕这是一件难以预计的事。

内容:

       在开发初期,为了能尽可能地创建可复用的代码,我们需要理解两个概念:“组合”“继承”,这里围绕以下7个问题来展开叙述:

  1. 什么是组合?
  2. 什么是继承?
  3. 什么时候使用组合?
  4. 什么时候使用继承?
  5. 组合和继承的区别是什么?
  6. 组合和继承应该选哪个?
  7. 组合和继承可以搭配使用吗?

叙述:

问: 什么是组合?

答:在创建新类的时候,将现有类的对象作为新类的成员,使得新类中包含了现有类的相关实现,从而实现代码的复用,这是(has-a关系)。举个例子:

//新类
public class CombinationDemo {

    //引入现有类作为新类的成员
    private CombinationDemo1 c=new CombinationDemo1();

    public void say(){
        //调用现有类的方法
        c.say();
    }

    public static void main(String[] args) {
        CombinationDemo cd=new CombinationDemo();
        cd.say();
    }
}

//现有类
class CombinationDemo1 {
    public void say(){
        System.out.println("调用现有类的方法");
    }
}

问: 什么是继承?

答:新类(子类)是现有类(父类)的延申,新类不但具有了现有类的所有行为而且还具备自身独有的行为和状态,通过对现有类的延申从而实现代码的复用,这是(is-a关系)。举个例子:

//新类(子类)
public class InheritDemo extends Parent {

    public static void main(String[] args) {
        InheritDemo inheritDemo=new InheritDemo();
        inheritDemo.say(); //调用父类的方法
    }
}

//现有类(父类/基类)
class Parent{
    
    public void say(){
        System.out.println("输出父类的say()");
    }
}

问: 什么时候使用组合?什么时候使用继承?

答:在编写代码的时候,我们更应该优先考虑使用组合,尽管继承在java编程里处于重要位置。那么什么时候考虑使用继承呢?当需要对类进行向上转型的时候,就应该考虑使用继承。我们可以暂时地通过判断是否需要进行向上转型来考虑用继承还是组合,可以根据具体的业务场景来做出适当的选择。


问: 组合和继承的区别是什么?

答:组合是(has-a关系),继承是(is-a关系),这是两者间的分水岭,加之使用继承会增加耦合度。


问:组合和继承应该选哪个?

答:

  • 除非两个类之间是“is-a”的关系,否则不要轻易的使用继承,不要单纯的为了实现代码的重用而使用继承,因为过多的使用继承会破坏代码的可维护性,当父类被修改时,会影响到所有继承自它的子类,从而增加程序的维护难度和成本。
  • 不要仅仅为了实现多态而使用继承,如果类之间没有“is-a”的关系,可以通过实现接口与组合的方式来达到相同的目的。设计模式中的策略模式可以很好的说明这一点,采用接口与组合的方式比采用继承的方式具有更好的可扩展性

问:组合和继承可以搭配使用吗?

答:可以,这个问题具体看实际情况而定

结论: 

       通过类与类关系的判断,如果是has-a关系,应优先考虑使用组合的方式来构造代码,如果是is-a关系,则应考虑使用继承

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值