多重inheritance

在你开始投票给我之前请大家阅读这个问题,请理解我不会尝试在这里开始任何不愉快的事情。

这个问题的唯一原因是我越来越意识到这一点,为了更有用,我必须知道Java和/或C#。

好的,这是一个问题:

我知道在J和C#中禁止多重inheritance。 但是如果我做这样的事情(因为我希望有一个inheritance自B和A两个类的类):

//code in Java public class B { public void methodFromB() { } } public class A extends B { public void methodFromA() { } } public class C extends A { public void methodFromC() { } } 

事实上,据我所知,我确实inheritance了它们(A和B,是的,我确实理解对此的正式解释是对象A是一个专门的B但是如果我想这样做的话就更少了我会,但它看起来不漂亮)

但是,不是在一个声明中执行此操作,而是必须首先创建一个inheritance自另一个类的类,然后从它派生?

虽然有趣的事情。 在上面声明了这些类(在NetBeans中)之后,我看到在创建了类C的实例(在main中)之后,我无法在其上调用methodFromC,这是此类中定义的方法。

这是什么原因?

谢谢。

您对多重inheritance的定义不正确。

在OO级别,多重inheritance得到了很好的清晰定义。

C ++和Java都支持多重inheritance。

问题是大多数程序员都有绝对零OO / OOA / OOD概念,他们所知道的只是OOP实现细节。 因此他们错误地认为“inheritance”“实施inheritance”的同义词。

然而,这是完全错误的

因为Java支持多(接口)inheritance,这恰好是面向对象分析/面向对象设计级别存在的真实且唯一的inheritanceforms。

向我展示由OOA产生的任何 OOD并且正在使用多重inheritance,并且我可以使用多个接口inheritance将其干净地转换为Java中的OOP(作为Java中的额外奖励,“钻石”问题不存在)。

即使您正在创建C的实例,C的方法是否可见取决于您使用的编译时类型。 例如,

 C c = new C(); c.methodFromC(); // fine 

是有效的,但是

 A a = new C(); a.methodFromC(); // compiler error 

不是,因为编译时类型是A ,它没有声明methodFromC

请注意,由于C和A都是B的子类,因此在两种情况下调用methodFromB都可以。

我同意mdma。 另请注意,这不是多重inheritance,这是链接inheritance。 多重inheritance是指一个类同时从多个类inheritance:

 class A {} class B {} class C extends A, B {} 

如果您没有使用C ++进行编码,那么这是禁止的

那不是多重inheritance。 你是对的C#不支持真正的多重inheritance。 值得注意的是,在C#中模拟多重inheritance的规范模式如下。

 public interface IA { void DoA(); } public interface IB { void DoB(); } public class A : IA { public void DoA() { Console.WriteLine("A"); } } public class B : IB { public void DoB() { Console.WriteLine("B"); } } public class MultipleInheritanceExample : IA, IB { private IA m_A = new A(); private IB m_B = new B(); public void DoA() { m_A.DoA(); } public void DoB() { m_B.DoB(); } } 

它绝对不像纯粹的多元inheritance那样优雅,但是完成工作,带有更多的工作。 您可以获得多重inheritance的大部分好处,包括最重要的一个,即多态性。 但是,您不inheritance该实现。 您必须重新实现从所有基类inheritance的所有成员。 这是通过将这些成员调用映射到每个基类的具体实例来完成的。

在C#中,您可以利用扩展方法来缓解不inheritance实现的问题。

 public static class IAExtensions { public static void Foo(this IA target) { target.DoA(); } } 

当然,这有其自身的问题。 它实际上并没有导致任何类型的inheritance,这意味着IA接口实际上没有Foo方法。 这意味着只有导入IAExtensions类的代码才能使用它的方法。 换句话说,这里没有多态性。

你可以将这些机制结合在一起,将大部分内容融合在一起,类似于多重inheritance的function,但它并不优雅。 就个人而言,我发现C#开发人员采用的变通方法模仿多重inheritance比使用纯多重inheritance更具攻击性。 但是,C#不太可能很快就会获得多重inheritance。

C#中的替代品(可能存在于Java中,但我不是Java人员,所以我不知道)是接口。

 public interface C { int SomeMethodInC(); } public class A { } public class B : A, C { } ... in other class.... B someB = new B(); i someInt = someB.SomeMethodInC(); 

它看起来像多重inheritance,但事实并非如此。 接口C定义someMethodInC的签名,但不定义实现。 B类必须实现someMethodInC。

在C#中,您只能从一个类inheritance,但您可以inheritance多个接口。 (我认为与Java相同。)

在C#中,您还可以使用扩展方法将实现附加到接口。

 public static class CExtensions { public static int SomeExtensionToC(this C someC, int someInt) { return someInt * 2; } } ... in code ... B objB = new B(); y = objB.SomeExtensionToC(x); 

SomeExtensionToC的方法和实现都可用于任何inheritanceinterface C类。 请注意,类和方法都是静态的,并且第一个参数包含关键字“this”以引用实现C的对象..NET框架的某些部分(LINQ,作为示例)实现为IEnumerable扩展方法IEnumerable

几乎像多重inheritance,没有坏的部分。 并且扩展方法仍然被认为是接口的一部分,因此可以被视为接口C中固有的“契约”的一部分。