【问题标题】:Not exactly sure how to use interfaces for multiple inheritance c#不完全确定如何使用接口进行多重继承 c#
【发布时间】:2013-07-15 07:57:18
【问题描述】:

我目前正在将我的游戏引擎的语言从 c++ 更改为 c#。在 c++ 中,我可以简单地在我的类中继承两个类,这使事情变得更简单,但是我发现这在 c# 中是不可能的。相反,我必须使用接口。

我已经四处寻找示例,我知道这里有很多;我不知道如何在我的情况下实现它。

请注意,我是按照教程生成此代码的,因此我对多态性的了解可能是错误的。

C++ 代码:

class TileMap : public sf::Drawable, public sf::Transformable
{
    ...
private:

    //this virtual function is simply so we don't have to do window.draw(target, states), we can just do window.draw(instance)
    //this is called polymorphism?
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // apply the transform
        //this isn't our method, i assume it's something in draw() by default.
        //or this generates the finished quads in one image instead of multiple ones.
        states.transform *= getTransform();

        // apply the tileset texture
        //this puts the texture on to what we're going to draw (which is converted in to a single texture)
        states.texture = &m_tileset;

        // draw the vertex array
        target.draw(m_vertices, states);
    }
}

我的 tilemap 类继承了 Drawable 类。 states.transform *= getTransform() 意味着我需要继承 Transformable 类。

但是,我不能像 c++ 一样在 c# 中执行此操作,继承这两个类是行不通的。 我认为这就是我需要使用接口的地方。

public interface Transformable{ }
public interface Drawable : Transformable{ }

我想在 Drawable 类中我会实现虚拟绘图功能,但是,我实际上并没有从 Transformable 实现 getTransform 函数,所以我不知道如何像这样访问它。

有人可以告诉我如何使用接口来使用我在此处提供的功能吗?

谢谢。

【问题讨论】:

  • 也许你有兴趣阅读composition over inheritance
  • 您的“Drawable”接口不需要实现“Transformable”:至少在您发布的 C++ 代码中并不明显。有 2 个独立的接口,并在您的 TileMap 类中实现它们。正如 Corak 建议的那样,您还应该检查是否可以编写一些行为。
  • 感谢@Corak @aquaraga 使用接口让我感到困惑的一件事是我实际上并没有为getTransform 提供实现,我使用的是我继承的类中的实现。因此,我不知道如何让它在这种情况下工作。您认为如果可能的话,您可以向我展示如何实现此功能的示例吗?谢谢。

标签: c# c++ inheritance interface polymorphism


【解决方案1】:

接口不能替代继承。

有了接口,你就可以“继承”,嗯……一个接口。也就是说,一堆签名的公共成员(方法、属性)。您实际上不能从接口继承任何有意义的内容。当你选择实现一个接口时,你给自己增加了一个负担,你要实现接口的所有成员。它可以帮助你在设计阶段,但它不会帮助你重用已经存在于另一个类中的实现。

您可以从 C++ 中的多个类继承,这是一个事实,您可以在 C# 中实现多个接口,这是另一个事实。但是后者不是获取前者的 C# 方式。它们是两个不同的属性,两者都是正确的,一个是 C++ 语言,另一个是 C# 语言和 .NET 平台。

【讨论】:

    【解决方案2】:

    在 .NET 中让 X 继承自 Y 可以完成两个基本正交的事情:

    1. 代码 *inside* `X` 可以使用父 *object instance* 的 `protected` 实例成员,或 `Y` 的静态 `protected` 成员,就好像它们是自己的一样。
    2. “X”类型的对象可以传递给任何需要“Y”类型实例的代码。

    一个对象只能有一个父对象实例;因此,对象只能使用从单个父类接收到的受保护实例成员(这些成员可以在“祖父”类中声明,但仍通过父类接收)。由于从 class 继承会自动完成上述两项工作,这意味着类只能从一个 class 继承。然而,对于一个对象可以允许自己被替换的类型的数量没有内在的限制。接口实现允许将实现接口的任何类型的对象传递给期望接口类型引用的任何代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 2016-11-08
      • 2013-02-07
      • 1970-01-01
      • 2021-06-23
      • 2010-11-30
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多