0

現在、ゲーム エンジンの言語を C++ から C# に変更中です。C++ では、クラス内に 2 つのクラスを継承するだけで簡単に処理できますが、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);
    }
}

私のタイルマップ クラスはクラスを継承しDrawableます。クラスを継承するstates.transform *= getTransform()ために必要な手段Transformable

ただし、c++ とまったく同じように c# でこれを行うことはできません。両方のクラスを継承することはできません。これは、インターフェイスを使用する必要がある場所だと思います。

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

Drawable クラスでは仮想描画関数を実装すると思いますが、実際には Transformable から getTransform 関数を実装していないため、このようにアクセスする方法がわかりません。

ここで提供した関数でインターフェイスを使用してこれを行う方法を教えてください。

ありがとう。

4

2 に答える 2

2

インターフェイスは継承の代わりにはなりません。

インターフェイスを使用すると、「継承」するだけです...インターフェイス。つまり、パブリック メンバー (メソッド、プロパティ)の署名の束です。インターフェイスから意味のある内容を実際に継承することはできません。インターフェイスを実装することを選択すると、インターフェイスのすべてのメンバーを実装するという負担が自分にかかります。設計段階では役立ちますが、別のクラスに既に存在する実装を再利用するのには役立ちません。

C++ で複数のクラスを継承できるのは事実であり、C# で複数のインターフェイスを実装できるのもまた事実です。しかし、後者は前者を取得する C# の方法ではありません。これらは 2 つの異なるプロパティであり、どちらも真であり、一方は C++ 言語のものであり、もう一方は C# 言語と .NET プラットフォーム全体のものです。

于 2013-07-15T08:40:39.110 に答える
0

X.NET で継承元を使用するとY、次の 2 つのほぼ直交することが達成されます。

  1. *内部* `X` のコードは、親の *オブジェクト インスタンス* の `保護された` インスタンス メンバー、または `Y` の静的な `保護された` メンバーを、あたかもそれ自体のものであるかのように使用できます。
  2. タイプ `X` のオブジェクトは、タイプ `Y` のインスタンスを期待する任意のコードに渡すことができます。

オブジェクトが持つことができる親オブジェクト インスタンスは 1 つだけです。その結果、オブジェクトは単一の親クラスから受け取った保護されたインスタンス メンバーのみを使用できます (メンバーは「祖父母」クラスで宣言されていても、親を介して受け取ることができます)。クラスから継承すると上記の両方が自動的に行われるため、クラスは 1 つのクラスからしか継承できないことを意味します。ただし、オブジェクトがそれ自体を置換できる型の数に固有の制限はありません。インターフェイスの実装により、インターフェイスを実装する任意の型のオブジェクトを、インターフェイス型の参照を期待する任意のコードに渡すことができます。

于 2013-07-15T15:52:22.693 に答える