多重继承

时间:2010-08-12 10:39:50

标签: c# java inheritance

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

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

好的问题是:

我知道J和C#中禁止多重继承。但是如果我做这样的事情(因为我希望有一个继承自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()
    {
    }
}

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

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

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

这是什么原因?

感谢。

5 个答案:

答案 0 :(得分:7)

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

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

有效,但

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

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

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

答案 1 :(得分:6)

我同意mdma。另请注意,这不是多重继承,这是链式继承。多继承是指一个类在同时从多个类继承

class A {}
class B {}

class C extends A, B {}

如果您不使用C ++进行编码,则禁止使用

答案 2 :(得分:2)

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

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(); }

}

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

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

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

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

你可以将这些机制结合在一起,将大部分内容融合在一起,就像多重继承一样,但它并不那么优雅。就个人而言,我发现C#开发人员采用的变通方法模仿多重继承比使用纯多重继承更具攻击性。但是,C#不太可能很快或者可能永久地获得多重继承。

答案 3 :(得分:1)

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();

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

在C#中,您只能从一个类继承,但可以继承多个接口。 (我认为与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的方法和实现都可用于任何继承interface C的类。请注意,类和方法都是静态的,并且第一个参数包含关键字“this”以引用实现C的对象..NET框架的某些部分(LINQ,作为示例)实现为{的扩展方法{1}}。

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

答案 4 :(得分:-1)

您对多重继承的定义不正确。

在OO级别,多重继承是明确定义的。

C ++和Java都支持多重继承。

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

然而,完全错误

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

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

相关问题