2012-02-24 3 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++; 
    } 
} 

: I는 다음과 같습니다 "게임"라는 클래스가 있습니다. 그 내용은별로 중요하지 않습니다. 내가 찾고있는 것은 Game이 새로 추가 된 entity_ class에 소유자 (현재 게임 인스턴스)와 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

나는 인터페이스를 통해 추상 클래스를 선호하는 데 유효한 인수라고 확신하지 못합니다. – 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); 
} 

} 
관련 문제