0

ゲームの 2D シーン グラフを作成する準備をしています。そのルートでインターフェイスを使用するか、2 つまたは 2 つの抽象クラスを使用するかを知りたいです。私の要件は次のとおりです。

  • ベースノードアイテム
    • 行列を格納できる必要があります
    • 子ノードのリストも保存できる必要があります
    • および単一の親ノード
  • ノード項目を変換する
    • Draw メソッドが必要です (実装は同じである可能性が高い)
    • ベースノードアイテムが実装/派生されている必要があります
  • ドローアブル ノード アイテム
    • Draw メソッドが必要です (実装は異なる場合があります)
    • ベース ノード アイテムが実装/派生される必要があり、変換ノード アイテムと一緒に実装/派生することはできません。

これにはどの基本クラス/インターフェースのスキームを使用する必要がありますか?

4

3 に答える 3

2

Jasonhが基本をカバーしました-コードを共有したい場所で抽象クラスを使用し、そうでない場合はインターフェースを使用します。

1つのポイントを追加したいと思います。抽象クラスのルートを使用する場合でも、インターフェイスを作成することをお勧めします。他のクラスと同じように機能するサブクラスがいつ必要になるかはわかりませんが、何らかの理由で実際には別のクラスを継承する必要があります。抽象基本クラスは、実装コードを保存するのに最適です。ただし、インターフェースはより柔軟であるため、本当に正当な理由がない限り(つまり、テストで仮想メソッド呼び出しのパフォーマンスヒットを取得できないことが明らかになった場合)、インターフェースと、それが理にかなっている抽象基本クラスを使用してください。

これに関する私の一般的なルールは、インターフェイスを使用してAPIを定義し、抽象基本クラスを使用してインターフェイスの実装がコードを共有できるようにすることです。

于 2009-06-22T00:14:47.473 に答える
2

インターフェイスと抽象クラスは2つの異なる目的で使用されます。インターフェイスはコントラクトの定義に使用され、抽象クラスは基本実装を提供して共通コードを共有するために使用されます。したがって、コードの重複を避けるために、常にインターフェイスを使用し、場合によっては(そして、あなたの場合はそのような場合だと思いますが)クラスを抽象化する必要があります。

したがって、インターフェースのみを使用すると、次のようになります。

class Transformation : INode, ITransformation { }
class GraphicsObject : INode, IGraphicsObject { }

共通ノード固有のコードを基本クラスに分解できると思います。

abstarct class Node : INode { }

class Transformation : Node, ITransformation { }
class GraphicsObject : Node, IGraphicsObject { }
于 2009-06-22T00:22:58.033 に答える
1

差別化要因は、抽象クラスに入れることができるすべてのクラス間に共通のコードがある場合、およびそれらすべてがこのコードで同じメソッドのセットを必要とする場合です。その場合は、抽象クラスを使用してください。共通のコードがない場合、または共通であってはならないコードを共通にすることになる場合は、インターフェイスを使用してください。

于 2009-06-22T00:01:38.263 に答える