2012-02-24 5 views
1

私は現在、単純なゲーム用のライブラリをプログラミングしています。ほとんどの場合、自分で使用することを意図しています。 問題に遭遇しました。イベントを購読せずに起動する

class Game 
{ 

    private List<Entity> entities; 
    private int counter; 

    public Game() 
    { 
     entities = new List<Entity>(); 
     counter = 0; 
    } 

    public AddEntity(Entity entity_) 
    { 
     entities.Add(entity_); 
     // problem! how to inform entity_ that it was added? 

     counter++; 
    } 
} 

エンティティは、ゲーム内で動作する各オブジェクトから派生しなければならないクラスです。私はこのようになります「ゲーム」と呼ばれるクラスを持っています。その内容は本当に重要ではありません。私が探しているのは、Gameが、新たに追加されたentity_クラスに、その所有者(現在のゲームインスタンス)とそのID(「カウンタ」が何であるか)を通知する方法です。今は、 "OnAdd(Game owner_、int id_)"というメソッドを持つインターフェースを使うことを考えていますが、それは間違いなくうまくいくはずですが、それ以上の方法はないと確信していました。だから私の質問です:

私の問題は、より良い解決策は、インターフェイスよりもありますか? Entityのインスタンスは、それがどのゲームインスタンスに追加されているのかわからず、イベントのような目的のためのメソッドを使用することは私の目の中ではうまくいきません。もちろん私は間違っている可能性があります。

答えて

3

を追跡する必要が、それもイベントを使用せずにこの問題を解決するのは簡単ですしないので、宣言することができます。

... code ... 
entities.Add(entity_); 
entity_.AddToGame(this); 
... code ... 

、次にAddToGameメソッドでは、イベントハンドラで何をしてもかまいませんが、これは現在必要ではありません。

+0

Clever。 +1のオブジェクト責任の "フリップ"。 – KeithS

1

はいそうです。しかし、違いを追加する必要があります。

インターフェイス - 変更が完了したら、すべての実装を追跡する必要があります。

抽象クラス - 仮想関数は、あなたのEntityがタイプGameの性質を持っている場合の実装のために

+0

私は、Interfaceを介してAbstractクラスを支持するための有効な議論ではないと確信しています – RichK

+0

は上記のポイント仮説ですか? – Pankaj

0

解決策はたくさんあります。

もちろん.Add後メソッドを呼び出すことができます。

entity_.HasBeenAdded(); 

別の解決策は、「アドオンを逆転」することです。

Entityクラス:ような何か

public Entity 
{ 

    ... 

    public void AddTo(IList<Entity> list) 
    { 
     if (list == null) 
     { 
      throw new ArgumentNullException(); 
     } 

     list.Add(this); 

     // Do some logic here, as you now know your object 
     // has been added. 
    } 
} 

... 

entity_.AddTo(entities); 
0

使用イベント。

class AAA 
{ 
    private List<Entity> entities;  
    private int counter;  
    public event Action<int> addEntiEvent; 

    public AAA()  
    { 
      entities = new List<Entity>();  
      counter = 0;  
    }  
    public AddEntity(Entity entity_) 
    {   
      entities.Add(entity_); 

     // problem! how to inform entity_ that it was added?   
     counter++;  

     if(null != addEntityEvent) 
     { 
      addEntityEvent(counter); 
     } 
    } 
} 

class BBB 
{ 
AAA aaa = new AAA(); 

public BBB() 
{ 
    aaa.addEntityEvent += new Action(addEntityEvent); 
} 

void addEntityEvent(int _counter) 
{ 
    Console.WriteLine("ok counter = "_counter); 
} 

} 
関連する問題