2009-06-21 6 views
0

私は自分のゲームの2Dシーングラフを作成する準備をしています。私はそれがルートであるのか、2つまたは2つの抽象クラスで使うべきかを知りたいと思います。ここに私の要件です:新しい階層を構築するには、抽象クラスまたはインタフェースを使用しますか?

  • ベースノード項目
    • は行列
    • を保存できるようにする必要があり、子ノード
    • のリスト ならびに単一を保存できるようにする必要があります親ノード
  • がトランスフォームノード項目
      描画方法を有することがの
    • ニーズ(実装は同じである可能性が高い)
    • ベースノードアイテムが 描画領域ノード項目
      • を有する必要がある
    • から誘導/実装されている必要がDrawメソッド(実装は異なる場合があります)
    • は、ベースノード項目が であることを必要とします。 は実装されていません。 は実装されていません。 ransformノード項目

私は、このための基本クラス/インタフェースのどのようなスキームを使用する必要がありますか?

+1

ここSO関連の質問です:私が正しくあなたを理解していれば、私の最善の策を構築することですので基本クラス対インタフェースhttp://stackoverflow.com/questions/56867/interface-vs-base-class –

答えて

2

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

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

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

+0

必要に応じて他のクラスから引き出すことができるように、インターフェイスを実装するいくつかの抽象クラス? – RCIX

1

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

2

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

したがって、インターフェイスでのみ以下を取得できます。

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

共通ノード固有のコードを基本クラスに組み込むことができます。

abstarct class Node : INode { } 

class Transformation : Node, ITransformation { } 
class GraphicsObject : Node, IGraphicsObject { } 
関連する問題