来自Java的“菱形继承“,你听说过吗?

一、菱形继承的概念

菱形继承又叫做钻石继承,指的是不同的类同时继承自相同的父类,存在一个子类同时继承这些不同的类,即我们常说的“多继承”问题。

例如:B类和C类分别继承A类,而D类同时继承B类和C类。

如此图所示

 二、代码演示

我们通过IDEA分别创建A、B、C和D类,演示存在的问题:

public class A {
    public void sayHi(){
        System.out.println("我是A");
    }
}

public class B extends A{
    public void sayHi(){
        System.out.println("我是B");
    }
}

public class C extends A{
    public void sayHi(){
        System.out.println("我是C");
    }
}

public class D extends B,C{
    public void sayHi(){
        System.out.println("我是D");
    }
}

接下来我们创建主函数:

public class Main {
    public static void main(String[] args) {
        B b=new B();
        b.sayHi();
        C c=new C();
        c.sayHi();
        D d=new D();
        d.sayHi();
    }
}

当我们点击运行按钮,会提示该内容报错:

很显然,我们的代码不存在任何问题。IDEA认为此处有语法错误,因为Java默认不支持对多个类的继承。

三、问题分析

1. 上述的示例代码比较简单,如果业务代码的逻辑比较复杂,多继承会导致编程的难度大大提升,会增加代码的复杂度。(Java并不支持)

2. 如果可以支持多继承,那么我们需要根据上述案例思考:如果D类可以同时继承B类和C类且不进行方法的重写,当我们在主函数中进行调用D类的 sayHi() 方法时,到底该调用父类B类的方法呢,还是该调用父类C类的方法呢?这就导致我们的程序的方法的调用存在二义性的问题。

3. 如果可以支持多继承,子类同时继承多个父类,子类的子类又同时继承多个父类,以此循环往复,这不就是传说中的套娃吗?多继承会导致我们的程序存在“多继承的膨胀性‘,会增加继承层次的复杂性和混乱性。

四、我能想到的解决方案

1. 依据设计模式,我们可以实现:对其他类进行组合,复用其他类的功能

2. 继承一个类的同时实现某些接口:实现对父类的功能的增强和拓展其他功能

3. 实现多个接口:因为Java支持一个类实现多个接口,实现类似的多继承的效果

4.1 演示实现多接口

分别创建 IPlay 接口和 ISayhi 接口:

public interface IPlay {
    public abstract void play();
}

public interface ISayhi {
    public abstract void sayHi();
}

修改D类的代码:

public class D implements ISayhi,IPlay{
    public void sayHi(){
        System.out.println("我是D");
    }

    @Override
    public void play() {
        System.out.println("我可以玩");
    }
}

主函数进行调用:

public class Main {
    public static void main(String[] args) {
        B b=new B();
        b.sayHi();
        C c=new C();
        c.sayHi();
        D d=new D();
        d.sayHi();
        d.play();
    }
}

输出结果如下:

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敖云岚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值