精华内容
下载资源
问答
  • 但是你可以像下面这样实现继承多个类 class A extends B class C extends A 这样C就同时继承了B和A两个类在C++看来,这个多继承就好解决多了class A{public:virtual void foo(){printf("A")}};c...
    展开全文
  • java中一个类不能直接继承两个类比如说这样: class A extends B,C 不能这样写,因为java不支持多继承, 但是你可以像下面这样实现继承多个类 class A extends B class C extends A 这样C就同时继承了B和A两个类
    java中一个类不能直接继承两个类比如说这样:
    class A extends B,C
    不能这样写,因为java不支持多继承,
    但是你可以像下面这样实现继承多个类
    class A extends B
    class C extends A
    这样C就同时继承了B和A两个类
    
    
    在C++看来,这个多继承就好解决多了
    class A{public:virtual void foo(){printf("A")}};
    calss B{public:virtual void foo(){printf("B")}};
    .
    .
    .
    class x:public A,public B,...
    {
        void foo(){printf("X");};
    }

    
    
    知乎上对多继承有比较详细的回答:https://www.zhihu.com/question/21476063
    作者:仲晨 链接:https://www.zhihu.com/question/21476063/answer/18351313 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
    多重继承是一件很复杂、很容易产生问题的功能。它跟Goto语句一样,利弊交织。 以下分两部分叙述,第一部分是Python多重继承遇到的麻烦,第二部分是Java和Ruby如何折中多重继承需求。 ============================================ 第一部分: Python是支持多重继承的,但为了解决多重继承的方法查找顺序问题(被称为MRO),有一场苦难史: 1. 传统模式 直接使用深度优先算法(并且,从左向右),每个类选择其第一次出现的位置。比如
    class A:
      def save(self): pass
    class B(A): pass
    class C:
      def save(self): pass
    class D(B, C): pass
    
    作为D类的一个实例,它的成员寻找顺序是:D、B、A、C。
    但当碰到如下这样一个“菱形继承”就麻烦了:
    class A:
      def save(self): pass
    class B(A): pass
    class C(A):
      def save(self): pass
    class D(B, C): pass
    
    作为D类的一个实例,寻找顺序也是D、B、A、C,但调用其save方法时,到底是调用A中的呢?还是C中的呢?直观上看,应该是C。这里有产生矛盾了。
    2. Python2.2的new-style class模式
    Python2.2中引进了new-style class,说白了就像java一样,所有类都继承自最根本的object类。
    这就让“菱形继承”变成十分普遍,于是只能改变MRO策略。
    仍然使用深度优先搜索、从左向右,但是每个类选择其最后一次出现的位置。
    这样一来,对上面的“菱形继承”就处理比较完美了,形成的顺序是:D、B、C、A,越是公用基础类,越放在后面。
    但是,碰到交叉继承,就又懵了。
    <img src="https://pic4.zhimg.com/d067bccb353065c3276a96f6aab93a77_b.jpg" data-rawwidth="113" data-rawheight="179" class="content_image" width="113">这里,X和Y都继承自O,A继承(X,Y)(注意,有先后顺序),B继承(Y,X),再有个最下面的类继承(A,B)。这里,X和Y都继承自O,A继承(X,Y)(注意,有先后顺序),B继承(Y,X),再有个最下面的类继承(A,B)。
    按照上述算法出来的结果是:?、A、B、Y、X、O。这就有些奇怪了,明明A在B前,A继承的X在Y前,可为啥X的优先级比Y要低呢?
    3. C3算法
    1996年,一帮牛人写了一篇文章A monotonic superclass linearization for Dylan,提供了一个基于层级计算的线性MRO算法,被称为C3,整体上比较合理了。(算法不详说了)
    在2012年被加入了Dylan语言,2007年加入了Python2.3,此外还有Perl 6、Parrot等语言之中。
    这样虽说基本解决了计算问题,但多重继承本身就有很多让人疑惑的地方,比如:
    <img src="https://pic4.zhimg.com/c1e6e9a3a1df789b9686582a9367326b_b.jpg" data-rawwidth="251" data-rawheight="171" class="content_image" width="251">参考文献:参考文献:
    python-history.blogspot.jp
    The Python 2.3 Method Resolution Order
    ============================================
    第二部分:
    多重继承那么复杂,可单一继承又那么拘束,咋办呢?
    1. 接口继承
    Java就是那么做的,只允许单一继承类(方法的实现),但可以继承多个接口(方法的定义)。
    Java的接口继承功能,既实现了静态语言的多重继承性,又避免了多重继承的数据构造的冲突和类层次的复杂性。
    但是,我们并不能说接口是解决问题的完美方案。接口也有不能共享实现的缺点。
    本来只是为了跨越继承层次来共享代码,现在却需要另外生成一个独立对象,而且每次方法调用都要委派给这个对象,这实在是不太合理,而且执行的效率也不高。
    ——《松本行弘的程序世界》
    2. Mix-in
    这是Ruby所推崇的,最初在Lisp中开始使用。规则如下:
    1. 通常的继承都是单一继承。
    2. 第二个以及两个以上的父类必须是Mix-in的抽象类(即不能单独生成实例,不能继承普通类)。
    这种规则下,既能够保持单一继承的结构,又能用Mix-in来共享方法的实现。
    展开全文
  • 继承会产生钻石问题(菱形继承) ...接口中的方法是抽象的,一个类实现可以多个接口 假设这些接口中存在相同方法(方法名与参数相同),在实现接口时,这个方法需要实现类来实现,并不会出现二义性的问题 ...

    多继承会产生钻石问题(菱形继承)

    • 类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法
    • 类 D 同时继承了类 B 和类 C
    • 对于类 B、C 重写的类 A 中的方法,类 D 会继承哪一个?这里就会产生歧义
    • 考虑到这种二义性问题,Java 不支持多重继承

    Java 支持类实现多接口

    • 接口中的方法是抽象的,一个类实现可以多个接口
    • 假设这些接口中存在相同方法(方法名与参数相同),在实现接口时,这个方法需要实现类来实现,并不会出现二义性的问题

     

     

    展开全文
  • /****/package test;import test.A.B;/*** @author yinwoods* 2015年12月29日*/public class Test extends A.B.C {/*** @param b* @param str*/public Test(B b, String str) {b.super(str);}/*** @param args*/...

    /**

    *

    */

    package test;

    import test.A.B;

    /**

    * @author yinwoods

    * 2015年12月29日

    */

    public class Test extends A.B.C {

    /**

    * @param b

    * @param str

    */

    public Test(B b, String str) {

    b.super(str);

    }

    /**

    * @param args

    */

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    A.B b = new A("A1").new B("B2");

    Test test = new Test(b, "C3");

    }

    }

    class A {

    A(String str) {

    System.out.println(str);

    }

    class B {

    B(String str) {

    System.out.println(str);

    }

    class C {

    C(String str) {

    System.out.println(str);

    }

    }

    }

    }

    A1

    B2

    C3

    打印结果为:

    这样做是对的,但具体原因我也没弄懂。

    展开全文
  • 接口能继承另一接口,和之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。 下面的Sports接口被Hockey和Football接口继承: // 文件名: Sports.java public interfa
  • Lua该如何实现一个类,实现继承 Lua是一门解释型语言,C++,C#,Java等高级语言都属于编译型语言,编译型语言同解释型语言有着很大差别。(看官请自行百度) Lua没有类和继承的概念,但是很业务场景中,我们会...
  • 虚继承的功能是:当出现了菱形继承体系的时候,子孙不会继承多个原始祖先; 使用虚继承会导致基类的初始化任务必须由继承体系中最底层的完成, 即FinalClass的子类声明对象时,必须直接调用IAssistant中的...
  • 我需要限定某个抽象只能在我程序集实现,而不支持其他程序集实现,也就是我需要一不能被继承的抽象 ...有一些接口或方法等需要传入一抽象的,但这抽象里面有很方法或属性的定...
  • 如何实现一不可以被继承 解题思路: 这问题大家第一时间想到的答案是什么样子的呢,如果你牢固掌握了 C++继承 态部分的内容,记住了基类和派生的访问权限,记住了派生对象的构造过程,那么你能 够给...
  • 无意中看到一题目:题目大致意思是如何编写一不能被继承但是却能正常使用的? 当时首先想到的就是构造函数是私有的,这样的话就能不被继承,现实中我们使用的比较的就是单例模式,将构造函数私有化, 但是...
  • JS继承方式有很,主要分ES5和ES6继承的实现 先说一下ES5是如何实现继承的 ES5实现继承主要是基于prototype来实现的,具体有三种方式 一是原型链继承:即B.prototype-new A() 二是借用构造函数(call 或者 apply 的...
  • 在 JavaScript 中很时候都需要自定义错误,尤其是开发 Node.js 应用的时候。 比如一典型的网站服务器可能需要有 NetworkError, DatabaseError, ... 最直观的实现方式便是 继承 Error 。 但考虑 TypeSc...
  • 自定义异常Java 提供相当的异常,尽量使用它们而不要创建自己的异常如果遇到一不能用预定义异常恰当描述的问题,那就可以通过派生 Exception或其子类,例如,IOException,来创建自己的异常。...
  • 如何设计-继承

    2020-08-17 22:17:10
    继承设计应自底向上,设计初始阶段不考虑继承关系,遇多个类存在共同行为(实例变量及方法)时考虑是否应该使用继承,即两个类能否与上级类通过IS-A测试。 我认为继承设计不能自顶向下,即通过IS-A测试的均采用继承...
  • 通常情况下,我们会使用创建一个继承Thread的对象或实现Runnable接口的来创建线程,我们很少会注意如何创建线程更简洁,更方便,更能提高开发效率,其实创建线程的方式有很种,下面就来感受一下创建线程这操作...
  • 在Struts2中,Action可以不实现任何特殊的接口或者继承特殊的,仅仅是一POJO就可以;也可以实现Xwork2中的Action接口;但是由于Xwork的Action接口非常简单,为程序员提供的帮助有限,因此,在实际开发中,会更...
  • 可以实现多个接口,通过实现多个接口可以完成C++的多重继承;虽然OC在语法上禁止使用多继承,但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多继承。但是协议只能提供接口,而没有提供实现方式,如果...
  • java如何实现多继承

    万次阅读 热门讨论 2018-09-03 16:26:00
    在java中,原则上是不允许多继承的,也就是之间只可以单继承。 那么,有没有办法,可以在不使用接口的情况下实现多继承呢? 答案是可以。 使用内部就可以多继承,严格来说,还不是实现多继承,但是这种方法...
  • 如何用设计模式变相实现多继承? 我在现实中遇到这样一问题:有A,B,C,D,E,F,G。。。这样一些平级的,它们的功能差不多,仅是细微的差别,比如A是计算圆的面积,B则是计算矩形的...
  • 继承1:什么是继承继承是一种创建新的方式,在python中,新建的可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹。新建的成为子类或者派生。父类又可以成为基类或者超类。子类会遗传父类...
  • php 如何实现多继承

    2020-07-10 22:32:58
    为什么会想到这个问题,因为想到如果类继承多个接口,然后他们之间还有相同的属性和方法会引用谁的方法或属性,谁又会被覆盖? 总结: 1.使用 interface 声明不能被实例化,并且属性必须是常量,方法不能有方法体 ...
  • 可能的情况有:从一个类继承,从一个或多个接口继承,从一个类和一个或多个接口继承。 使用Type类的BaseType属性来取得类从哪个类继承。GetInterfaces方法来取得类都实现了哪些接口。 测试代码如下: 类库代码: ...
  • 在使用了多继承层次中这也是防止出现菱形继承层次结构的一好办法。要实现一不能被继承有很方法。  主要的思路是使子类不能构造父类的部分,这样子没有办法实例化整个子类。这样限制了子类的继承...
  • 如何继承

    2012-09-10 20:59:13
    [align=center][size=large]继承[/size][/align] 一、为什么需要继承? 一句话——不要浪费时间来做重复的...2)每个类(class)只能继承个类(class),但可以实现多个接口(interface). 3)实现一个接口时,需...
  • 具体分析如下:继承直白地说就是给一个类建一个或多个子类,要创建子类就必须在类声明中使用 extends 关键字,新类名在前,extends 在中,父类名在后。下例中,我们创建两个新类,BookProduct 和Cdp...
  • OC 如何实现多继承

    2020-12-16 19:10:18
    由于OC是一门动态的语言,会尽可能将事件的调用延迟至运行时进行确定,所以如果OC支持多继承就有可能会在运行时发现多个父类出现具有二义性的方法实现时无法抉择的选择性困难,所以OC并不像其他静态语言一样支持多继承...
  • 在java中,原则上是不允许多继承的,也就是之间只可以单继承。那么,有没有办法,可以在不使用接口的情况下实现多继承呢? 答案是可以。使用内部就可以多继承,严格来说,还不是实现多继承,但是这种方法可以...
  • Interface3 Extends Interface0, Interface1, interface……不允许多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一D方法,A如何决定该继承那一呢?但接口不存在这样的问题,接口全都是抽象方法继承....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,254
精华内容 1,301
关键字:

如何继承多个类