菱形继承问题(default)

菱形继承问题(default)

//InterfaceA
public interface InterfaceA {
    default void hello(){
        System.out.println("hello from A");
    }
}

//InterfaceA
public interface InterfaceB extends InterfaceA{
}

//InterfaceA
public interface InterfaceC extends InterfaceA {
}

//ClassD
public class ClassD implements InterfaceB, InterfaceC {

    public static void main(String[] args){
        new ClassD().hello();
    }
}

//console
hello from A....

但是如果在InterfaceB和InterfaceC中重写hello的方法,那么在ClassD中必须重写hello方法,不然编译会报错,可以指定继承其中一个接口中的方法:

public interface InterfaceA {

    default void hello(){
        System.out.println("hello from A");
    }
}

//
public interface InterfaceB extends InterfaceA{

    @Override
    default void hello() {
        System.out.println("hello from B");
    }
}

//
public interface InterfaceC extends InterfaceA {

    @Override
    default void hello() {
        System.out.println("hello from C");
    }
}
public class ClassD implements InterfaceB, InterfaceC {

    public static void main(String[] args){
        new ClassD().hello();
    }

    @Override
    public void hello() {
        InterfaceB.super.hello();
    }
}

//console
hello from B...

遵守下面这三条准则就能解决所有可能的冲突:

  • 首先,类或父类中显式声明的方法,其优先级高于所有的默认方法。
  • 如果用第一条无法判断,方法签名又没有区别,那么选择提供最具体实现的默认方法的接口。
  • 最后,如果冲突依旧无法解决,你就只能在你的类中覆盖该默认方法,显式地指定在你的类中使用哪一个接口中的方法。
Python支持多继承,即一个类可以同时继承多个父类。这种特性允许我们将多个相关的类组合在一起,以实现更复杂的功能。在Python中,可以通过在类定义时使用逗号分隔列出所有父类来实现多继承。例如,可以使用以下语法来定义一个类C同时继承类A和类B: class A: def hello(self): print('Hello from A') class B: def hello(self): print('Hello from B') class C(A, B): pass c = C() c.hello() # 输出:Hello from A 需要注意的是,当使用多继承时,可能会遇到钻石继承的情况。钻石继承指的是在一个继承关系中,某个类同时继承了两个或更多个父类,而这些父类又有一个共同的祖先类,形成了一个钻石形状的继承图。为了避免歧义和循环依赖问题,Python使用C3算法来计算方法解析顺序(Method Resolution Order, MRO)。如果存在循环依赖的情况,Python就会抛出"Cannot create a consistent method resolution"的错误 。 在使用多继承时,需要注意以下几点: 1. 避免钻石继承,可以使用菱形继承的方式,即让一个子类继承两个父类,而这两个父类分别继承自同一个父类。 2. 明确调用父类的方法。在多继承中,如果多个父类中都有相同的方法,可以使用super()函数来调用父类的方法。super()函数会按照MRO中的顺序调用父类的方法。 3. 确定继承顺序。在定义多继承类时,需要明确指定父类的继承顺序。如果没有明确指定,Python会按照一定的规则来计算MRO。可以使用mro属性来查看类的MRO 。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python多继承](https://blog.csdn.net/liulanba/article/details/129939140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值