C# 从多个抽象类派生类

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

}

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

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

最佳答案

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

所以基本上你必须兴奋地说明你在调用它时引用的方法,例如ParentA::ShowMessage()

如果你想要一个多态的类型到 2 个其他类型,你应该创建两个单独的接口(interface)并实现它们。如果您想重用相同的方法,则必须使用组合。

接口(interface)示例:

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
    }
}

使用组合的可重用 Show Message 方法接口(interface):

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

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

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

关于C# 从多个抽象类派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15216271/

相关文章:

c# - 在 C# 中使用 ThreadPool 的 lock 语句

c# - 有没有办法以编程方式将数据列表从sharepoint下载到excel

c++ - 需要帮助让类(class)相互交流

php - __autoload 与命名空间类给找不到文件的 fatal error

java - 如何使用 void 方法确保良好的测试覆盖率

java - 新列表<A & ?扩展 B>();

Flutter 用 RichText 填充空白

c# - 我对 String.EndsWith 的使用有什么问题?

c# - 每次对其执行操作时,SqlDataReader 对象都会抛出异常

objective-c - 类名含义后的人字形语句