【问题标题】:C# Deriving a class from more than one abstract classC#从多个抽象类派生一个类
【发布时间】:2013-03-05 05:08:16
【问题描述】:

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

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(),那么哪一个会在派生类)?

【问题讨论】:

  • 这就是接口的用途。您可能想了解何时使用它们以及何时不使用它们。
  • @billz : Bcz cpp 在 OOP 中也是如此......所以我做到了
  • @chris:是的,我知道。我做了与上面相同的接口示例。但是我在某处读到“具有所有抽象成员的抽象类可以与接口相同”。所以也尝试对抽象类进行同样的尝试......

标签: c# oop abstract-class


【解决方案1】:

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

【讨论】:

  • 阅读您的答案时出现疑问。在上面的接口示例中的 ClassOne 和 ClassTwo 中,这两个类都是非抽象的,但是您在其中使用了抽象方法。不能在非抽象类中声明抽象成员...ryt ?.
  • @Mortalus:修复了 DisplayPlace() 方法的变化。
【解决方案2】:

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

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

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

class DerivedClass : AbstractClassOne, IClassTwo
{

}

【讨论】:

  • 是的,我在某处读到“只包含抽象方法的抽象类可以使用与接口相同的方法”。这就是为什么我也尝试过这种方式。所以我认为我读到的内容是错误的。谢谢
  • @Arun 请参阅我的答案中有关在可能进行多重继承时发生的“钻石问题”的链接。一个例子是 c++,这可能就是你所读到的。
【解决方案3】:

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

【讨论】:

  • 感谢您的回复。是的,我知道我可以通过界面使用它。但是为什么我这样使用是,我在某处读到“只包含抽象方法的抽象类可以与接口相同”。所以我也尝试过这种方式..
  • 由于您将问题标记为 C# 和 C++,我猜您阅读的内容是关于 C++ 的。在 C++ 中没有接口,但人们使用抽象类,因为它们可以用作接口(并且 C++ 允许从任意数量的基类继承)。在 C# 中,如果类中确实有任何实现,则使用基类,否则使用接口。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2018-04-17
    • 1970-01-01
    • 2015-05-30
    • 2014-11-16
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多