0

我目前正在将我的游戏引擎语言从 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 函数,所以我不知道如何像这样访问它。

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

谢谢。

4

2 回答 2

2

接口不能代替继承。

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

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

于 2013-07-15T08:40:39.110 回答
0

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

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

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

于 2013-07-15T15:52:22.693 回答