博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java如何继承两个类?以及讨论一下多继承的利弊
阅读量:4221 次
发布时间:2019-05-26

本文共 2486 字,大约阅读时间需要 8 分钟。

java中一个类不能直接继承两个类比如说这样:class A extends B,C不能这样写,因为java不支持,但是你可以像下面这样实现继承多个类class A extends Bclass 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): passclass B(A): passclass C:  def save(self): passclass D(B, C): pass
作为D类的一个实例,它的成员寻找顺序是:D、B、A、C。
但当碰到如下这样一个“
菱形继承”就麻烦了:
 
  1. class
    A
    :
  2. def
    save
    (
    self
    ):
    pass
  3. class
    B
    (
    A
    ):
    pass
  4. class
    C
    (
    A
    ):
  5. def
    save
    (
    self
    ):
    pass
  6. 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年,一帮牛人写了一篇文章 ,提供了一个基于层级计算的线性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">参考文献:
参考文献:
============================================
第二部分:
多重继承那么复杂,可单一继承又那么拘束,咋办呢?
1. 接口继承
Java就是那么做的,只允许单一继承类(方法的实现),但可以继承多个接口(方法的定义)。
Java的接口继承功能,既实现了静态语言的多重继承性,又避免了多重继承的数据构造的冲突和类层次的复杂性。
但是,
我们并不能说接口是解决问题的完美方案。接口也有不能共享实现的缺点。
本来只是为了跨越继承层次来共享代码,现在却需要另外生成一个独立对象,而且每次方法调用都要委派给这个对象,这实在是不太合理,而且执行的效率也不高。
——《松本行弘的程序世界》
2. Mix-in
这是Ruby所推崇的,最初在Lisp中开始使用。规则如下:
  1. 通常的继承都是单一继承。
  2. 第二个以及两个以上的父类必须是Mix-in的抽象类(即不能单独生成实例,不能继承普通类)。
这种规则下,既能够保持单一继承的结构,又能用Mix-in来共享方法的实现。
你可能感兴趣的文章
cocos2.X版本lua端使用定时器的方法
查看>>
lua math.fmod使用注意小数问题
查看>>
lua 时间转化
查看>>
lua学习笔记之五(Lua中的数学库)
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第一篇:互联网时代U盘化生存方式 【张振华.Jack】
查看>>
CentOS6.4配置Hadoop-2.6.0集群配置安装指南(经过实战演练)【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第二篇:专注的力量 [张振华.Jack]
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第三篇:我的舍与得的2014[张振华.Jack]
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第五篇:不要给自己找任何借口【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第七篇:请留意我们身边的风景 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第八篇:坚持的力量 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第九篇:春节那些事-过年回家不需要理由【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十一篇:马云乌镇40分钟演讲实录【张振华.Jack】
查看>>
Java并发编程从入门到精通 张振华.Jack --我的书
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十二篇:世界上最快的捷径【张振华.Jack】
查看>>
Conclusion for Resource Management
查看>>
Conclusion for Constructors,Destructors,and Assignment Operators
查看>>
《浪潮之巅》1 AT&T
查看>>
《浪潮之巅》2蓝色巨人 IBM公司
查看>>
《浪潮之巅》3水果公司的复兴
查看>>