1

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

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:"
{

}

那么一个类只能派生自一个抽象类吗?

如果可以从多个抽象类派生,那么如果两个类都定义相同的方法会发生什么,就像上面的情况一样(抽象类一和二都有一个方法showmessage(),那么哪一个将在派生类中)?

4

4 回答 4

4

在 C# 中,不允许从多个类继承。要在这里做你想做的事,你需要使用接口。

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

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

class DerivedClass : AbstractClassOne, IClassTwo
{

}
于 2013-03-05T05:10:15.757 回答
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
    }
}
于 2013-03-05T05:14:34.400 回答
2

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

于 2013-03-05T05:11:16.367 回答
1

不,抽象类是否具有所有抽象方法或只有一些抽象方法,就继承而言没有区别。您只能继承一个类(在 C# 中)和任意数量的接口。

于 2013-03-05T05:21:55.463 回答