精华内容
下载资源
问答
  • C#-同时继承多个类

    万次阅读 2018-12-07 16:14:50
    面试题: using UnityEngine; public class Test : MonoBehaviour { // Use this for initialization void Start() ... IMyInterface my1 = new MyClass1();... IMyInterface my2 = new MyCl...

    面试题:

    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
            IMyInterface my1 = new MyClass1();
            IMyInterface my2 = new MyClass2();
            IMyInterface my3 = new MyClass3();
            IMyInterface my4 = new MyClass4();
    
            my1.Write();
            my2.Write();
            MyClass2 myClass2 = new MyClass2();
            myClass2.Write();
            my3.Write();
            my4.Write();
            MyClass4 myClass4 = new MyClass4();
            MyClass1 myClass5 = new MyClass4();
            myClass4.Write();
            myClass5.Write();
        }
    }
    
    
    interface IMyInterface
    {
        void Write();
    }
    
    public class MyClass1 : IMyInterface
    {
        public new void Write()
        {
            Debug.Log("1");
        }
    }
    
    public class MyClass2 : MyClass1
    {
        public new void Write()
        {
            Debug.Log("2");
        }
    }
    
    public class MyClass3 : MyClass2, IMyInterface
    {
        public new void Write()
        {
            Debug.Log("3");
        }
    }
    
    public class MyClass4 : MyClass3, IMyInterface
    {
        void IMyInterface.Write()
        {
            Debug.Log("4");
        }
    
        public new void Write()
        {
            Debug.Log("5");
        }
    }

    输出结果依次是:1,1,2,3,4,5,1


     

    展开全文
  • 继承会产生钻石问题(菱形继承) 类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法 ...接口中的方法是抽象的,一个类实现可以多个接口 假设这些接口中存在相同方法(方法名与参数相同),...

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

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


    Java 支持类实现多接口

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


    从 JDK1.8 开始,接口中允许有静态方法和方法默认实现。当检测到实现类中实现的多个接口中有相同的默认已实现的方法,编译报错


    PS:在JDK 1.5 上实践,接口可以多继承接口

    package constxiong.interview;
    
    /**
     * 测试继承多接口,实现相同方法
     * 从 JDK1.8 开始,接口中允许有静态方法和方法默认实现
     * 当检测到实现类中实现的多个接口中有相同的默认已实现的方法,编译报错
     * @author ConstXiong
     * @date 2019-11-21 10:58:33
     */
    public class TestImplementsMulitInterface implements InterfaceA, InterfaceB {
    
    	public void hello() {
    		System.out.println("hello");
    	}
    
    }
    
    interface InterfaceA {
    	
    	void hello();
    
    	static void sayHello() {
    		System.out.println("InterfaceA static: say hello");
    	}
    
    	default void sayBye() {
    		System.out.println("InterfaceA default: say bye");
    	}
    }
    
    interface InterfaceB {
    	
    	void hello();
    	
    	static void sayHello() {
    		System.out.println("InterfaceB static: say hello");
    	}
    
    //	default void sayBye() {
    //		System.out.println("InterfaceB default: say bye");
    //	}
    }
    

     


    【Java面试题与答案】整理推荐

     

    展开全文
  • 但是你可以像下面这样实现继承多个类 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两个类
    在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。
    但当碰到如下这样一个“ 菱形继承”就麻烦了:
    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年,一帮牛人写了一篇文章 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来共享方法的实现。
    展开全文
  • 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来共享方法的实现。
    展开全文
  • 而抽象在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象的一典型应用,假设某个项目的所有Servlet都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一...
  • Python中类的继承、多层继承和多继承 ...继承的语法为在类名后的小括号()中写入要继承的父类名,如果要继承多个类则中间用逗号分隔。 class Electrical(object): def __init__(self, name): self....
  • 一个类只能继承一个类,java继承多个类时编译时就不通过 为什么java支持 一个类实现多个接口;但是只能继承一个类 从上诉例子中可以看出,如果子类F可以同时继承抽象类D和类C,如果类D和类C中存在相同(同名同...
  • 在java中 一个类中不能继承多个接口,但是可以通过一个接口继承多个接口来实现。具体代码如下public interface LanguageBeharvior { public void language(); }public interface SpeakBeharvior { public void ...
  • java 不支持多继承,但可以实现多个接口,间接的实现多继承,也可以通过内部。 参考代码:MultiExtendsTest // 测试间接的实现多继承 public class MultiExtendsTest extends D implements A, B, C { @...
  • 摘要:虽然Java不允许多重继承,但是...然而还是存在一些情况,程序员们希望能够继承多个类。虽然Java不允许继承多个类,但是有些技巧能够模拟多重继承。我在Swing应用程序和Web应用中都使用过这个技巧。Swing应用打包
  • 个类可以只能继承一个抽象类,为什么接口可以多继承接口。谢谢大神帮我回答
  • Kotlin-30-继承多个父类

    千次阅读 2019-12-30 14:55:16
    Java中的类只能继承一个父类,是无法实现继承多个父类,但是一个类可以实现多个接口。 Java中的接口是无法给函数添加函数体的 abstract class TestFather { public abstract void funA(); } interface Test1 { ...
  • 个类继承多个接口的简单例子

    千次阅读 2013-04-23 21:43:41
    随时随地阅读更技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。 class 丈夫 implements 洗衣工,搬运工,提款机{ @...
  • java接口可以继承多个接口

    千次阅读 2019-03-07 19:11:54
    接口是常量值和方法定义的集合。接口是一种特殊的抽象。...不允许多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一D方法,A如何决定该继承哪一呢? 但接口不存在这样的问题,接口全都是抽象方法...
  • 在 IntelliJ IDEA 中这个查看一个类也就是当前类的所有继承关系,包括实现的所有的接口和继承的类, 这个继承,不仅仅是一级的继承关系,包括好几层的继承。父类的父类的父类。直到最后。 可以很清楚明了的了解一...
  • 继承:单继承多继承(有python有多继承,java没有) :经典,新式 新式:凡是继承object都是新式 python3X 中所有的都是新式,因为python3x中的都默认继承object 经典:不继承object都是新式...
  • C++中多继承

    万次阅读 多人点赞 2015-07-19 23:07:43
    在c++中一个类可以从多个基类中派生(即可以有多个父类),这就是多继承。多继承的方式主要有两种:1. 简单版本 类C会同时拥有类A和类B的特性(属性和方法,也就是两个类的所有成员)。这种方式很简单这里就不多说,...
  • Python中多继承

    千次阅读 2019-05-21 18:02:49
    文章目录Python中的多继承多继承Python多继承实现多继承的缺点Mixin*思路1**思路2**思路3**思路4*Mixin Python中的多继承 Python2.2之前是没有共同的祖先的,之后,引入object,它是所有的共同祖先...
  • C++ (多继承和虚继承)

    万次阅读 2018-07-29 16:00:46
    个类多个基类,这样的继承关系称为多继承; b. 多继承声明语法: class 派生类名: 访问控制符 基类名1,访问控制符 基类名2 { 数据成员和成员函数声明; } class A: public B,public c { } 图示: c. 多个...
  • 如果一个类可以继承多个类,那么这个类所有成员变量名和方法名必须要不同(C++就是这样要求的).这是前提,我们必须确定这个才能用多重继承,如果在类方法名或者成员变量名很多情况下,这是很复杂的事情.原因:要确定子类...
  • java中定义一个类可以同时继承个类  分享| 2013-09-18 17:12yfjmhe | 浏览 19117 次  继承 这句话对还是错?为什么? 专业回答 DM19890110 2013-09-18 17:58 这句话要看怎么理解...
  • c++如何防止一个类被其他类继承

    千次阅读 2017-07-25 23:44:56
    如何在防止一个类被其他的类继承呢?如果是仅仅为了达到这个目的可以直接把这个类的构造函数设置成私有的,这样就杜绝了其他类的继承。也相当于毁掉了这个类(无法再创造出自己的对象)。 那么怎么样既要保证这个类...
  • 接口能继承另一接口,和之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。 下面的Sports接口被Hockey和Football接口继承: // 文件名: Sports.java public interfa
  • C++——多继承

    千次阅读 2018-07-11 19:29:28
      如果一个派生多个基类继承, 则称为多继承。 多继承的声明: class 派生类名:访问控制 基类名1, 访问控制 基类名2, ... { 成员列表 } 注意: 多个基类的派生的构造函数执行的顺序与单继承的...
  • 重写一个类的方式用继承好还是分类好?为什么? 关于多继承: 首先 object-c不能够多继承,类似下面代码的这种方式是绝对通不过编译的.当然,你也可以把NSString前面的":"去掉再试试,呵呵! 那么有没有...
  • 第一,如果一个类继承多个父类,如果父类中的方法名如果相同,那么就会产生歧义。 第二,如果父类中的方法同名,子类中没有覆盖,同样会产生上面的错误。 所以,java中就没有设计类的多继承。 但是接口就设计成多...
  • java 一个接口可以继承多个接口吗

    万次阅读 2018-06-19 14:36:33
    Interface3 Extends Interface0, Interface1, interface……不允许多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一D方法,A如何决定该继承那一呢?但接口不存在这样的问题,接口全都是抽象方法继承....
  • java中接口是否可以继承多个接口?

    千次阅读 2018-11-06 20:04:52
    接口是常量值和方法定义的集合。接口是一种特殊的抽象。 java是单继承的。classB Extends classA ...java接口可以多继承。Interface3 Extends Interface0, Interface1, interface…… 不...
  • class 同时继承个类

    千次阅读 2017-06-11 15:22:17
    public class A{ } public class B extends C{ } public class C extends B{ C里面不需要写 已经有了A和B的所有内容 }

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,416,412
精华内容 566,564
关键字:

如何继承多个类