`
jobar
  • 浏览: 347407 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

缺省方法(4)-如何处理菱形问题?

 
阅读更多
如何处理菱形问题?

“菱形问题”是一种由于多重继承引起的歧义性问题。对于像c++这类允许状态多重继承的语言来说是一个严重的问题。然而在java中只能在接口上而不允许类的多重继承,因此不会包含状态。
考虑下面的情况:
   
interface A {
        default void m() { ... }        
    }
    interface B extends A {}
    interface C extends A {}
    class D implements B, C {}



上一节给出的缺省方法选择规则为这种情况及其变化提供了一个直观的解释。

在初始情况下(以上代码),D继承的方法m的实现没有歧义性,其由A定义,没有其他可能性。如果情况改变,B现在也声明了m的缺省实现,那么D继承的m的实现遵循“最具体实现”原则。但是,如果B和C都提供缺省实现,那么它们将发生冲突,且D必须提供一个覆盖声明,可能使用语法X.super.m(...)来显式选择继承其一。所有这三种情况正如先前的解释都被方法解析规则所清楚地涵盖。

缺省方法是虚拟的,就像Java中的所有方法。这有时会导致意想不到的结果。给定声明:
   
interface A {
        default void m() { System.out.println("hello from A"); }
    }
    interface B extends A {
        default void m() { System.out.println("hello from B"); }
    }
    interface C extends A {}
    class D implements B, C {}

代码

   
C c = new D();
    c.m();


将打印 hellow from B。C的静态类型并不重要;关键是它是D的实例,其m的最具体的版本继承自B。

原文链接:http://www.lambdafaq.org/what-about-the-diamond-problem/
分享到:
评论

相关推荐

    C++常见问题解答。。。。。。。。。

    - 实现拷贝构造函数和赋值运算符来处理深拷贝和浅拷贝的问题。 - 提供适当的方法来访问和修改容器中的元素。 - 处理并发访问的情况,确保线程安全。 #### 39. 如何处理异常? C++中处理异常的方式是使用`try`、`...

    (ebook pdf) Visual C++ in 21 Days Second Edition.pdf

    - 虚继承解决菱形问题 - 运算符重载与继承 **第十六天:流** - **学习目标**:掌握文件和流的操作。 - **关键知识点**: - 文件流类:`ifstream`、`ofstream`、`fstream` - 字符串流:`istringstream`、`...

    VC++考点复习纲要

    - **多继承和虚基类**:处理多个父类的继承关系,解决菱形问题。 - **多态性与虚函数**:实现动态绑定,虚函数是多态的基础。 - **运算符重载**:重新定义操作符的行为,包括成员函数和友元函数。 - **类模板**...

    Google-CPP 编码规范(中文版)最新版.pdf

    - **多重继承**:尽量避免多重继承,因为它可能导致菱形问题和其他复杂性。 - **接口**:使用纯虚函数来定义接口,以便强制派生类实现特定方法。 - **运算符重载**:仅在有意义的情况下重载运算符,并保持操作符的...

    BPMN2详细描述.doc

    斜线标记表示缺省 Flow,只有其他条件都不满足时才从本 Flow 流过。 在BPMN2中,消息(Message)可以表示在不同组织之间传递的各种形式信息,如Email、Fax、电话、信件、SOAP或JMS调用、人工传递的口信。可以发送...

    C++程序设计练习题与答案.pdf

    4. **虚基类**:用`virtual`关键字声明的基类称为虚基类,解决多重继承中公共基类的唯一性问题,避免菱形继承问题。 5. **继承访问控制**:派生类对基类的继承有三种方式:公有继承(`public`)、私有继承(`...

    SQL知识点记录解释说明

    - **联系**:用菱形表示,显示实体之间的关系。 - **联系的类型**: - **一对一**:两个实体之间存在一对一的关系。 - **一对多**:一个实体对应多个实体。 - **多对多**:两个实体之间存在多对多的关系。 - *...

    C++编程思想

    多重继承增加了语言的灵活性,但也带来了复杂性,如菱形继承问题。 17. 异常处理:C++提供了异常处理机制来处理运行时出现的错误情况。这包括try、catch和throw关键字,用于捕获和处理异常。 18. 运行时类型识别...

    Java开发技术大全(500个源代码).

    overrideMember_4.java 成员方法覆盖示例4 overrideMember_5.java 成员方法覆盖示例5 Paintable.java 实现了多个接口的方法 PaintedPoint.java 实现了多个接口的方法 Point.java 一个简单的类 PrintColors....

    大学C 期末考试试卷(含答案).doc

    大学C++期末考试试卷(含答案) 本文将对大学C++期末考试试卷的每个问题进行详细解释,并对相关的知识点进行总结。...解释:设置虚基类的目的是为了实现多继承,以避免菱形继承问题。 知识点:虚基类、多继承。

    c++练习题2.docx

    虚基类用于解决多重继承中的菱形问题,确保只有一个基类实例。 8. 要实现动态联编必须D. 通过对象指针或引用来调用虚函数。这是多态性的体现,使得指针或引用指向不同派生类对象时能调用相应的重载函数。 9. 在...

Global site tag (gtag.js) - Google Analytics