C#从多个抽象类派生一个类

时间:2013-03-05 05:08:17

标签: c# oop abstract-class

我创建了两个抽象类,并尝试创建一个继承自两者的类。但我收到一条错误消息。

abstract class AbstractClassOne
{
    public abstract void ShowMessage();
    public abstract void DisplayName();
}

abstract class AbstractClassTwo
{
    public abstract void ShowMessage();
    public abstract void DisplayPlace();
}

class DerivedClass : AbstractClassOne, AbstractClassTwo // here under AbstractClassTwo it shows the error "cannot have multiple base classes:"
{

}

所以一个类只能从一个抽象类派生出来?

如果可以从多个抽象类派生,那么如果两个类定义相同的方法会发生什么,如上所述(抽象类1和2都有方法showmessage(),那么哪一个将是在派生类中)?

4 个答案:

答案 0 :(得分:4)

在C#中,不允许从多个类继承。要在此处执行所需操作,您需要使用接口。

abstract class AbstractClassOne
{
    public abstract void ShowMessage();
    public abstract void DisplayName();
}

Interface IClassTwo
{
    void ShowMessage();
    void DisplayPlace();
}

class DerivedClass : AbstractClassOne, IClassTwo
{

}

答案 1 :(得分:4)

C#不允许多重继承,但C ++允许这样做。 回答有关ShowMessage()方法的问题,该方法是c ++中具有多重继承的已知问题,称为“钻石问题”。见:http://en.wikipedia.org/wiki/Multiple_inheritance

所以基本上你必须要有兴奋性状态,你在调用时可以采用哪种方法进行裁判,例如: ParentA::ShowMessage()

如果你想拥有一个多态到2种其他类型的类型,你应该创建两个独立的接口并实现它们。如果你想重复使用相同的方法,你将不得不使用合成。

接口示例:

public interface ISomeInterface
{
    public void ShowMessage();
    public void DisplayName();
}
public class ClassOne : ISomeInterface
{
    public void ShowMessage()
    {
       //implementation
    }

    public void DisplayName()
    {
       //implementation
    }
}

public class ClassTwo : ISomeInterface
{
    public void ShowMessage()
    {
       //implementation
    }

    public void DisplayPlace()
    {
       //implementation
    }
}

使用合成的可重复使用的显示消息方法的接口:

public class ClassTwo : ISomeInterface
{
    private ISomeInterface _MyPrivateReusableComponent = new ClassOne();

    public void ShowMessage()
    {
       _MyPrivateReusableComponent.ShowMessage()
    }

    public void DisplayPlace()
    {
         _MyPrivateReusableComponent.DisplayName()
        //implementation
    }
}

答案 2 :(得分:2)

您不能从多个类(抽象或其他类)继承,但在您的情况下,抽象类几乎是接口,因此您可以将它们转换为接口并从它们继承(您可以从任意数量的接口继承)接口)。

答案 3 :(得分:1)

不,抽象类是否具有所有抽象方法或只有一些,对于有关的继承没有任何区别。您可以继承只有一个类(在C#中)和任意数量的接口。