2016-01-05 64 views
1

道歉標題有誤導之嫌,但我不知道確切地稱之爲什麼,我這裏尋找。我有以下「主要」類:事件處理 - 發件人爲主要類別中,如果

public class Entity : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public EntityRole Role { get; set; }   
    public EntityStats Stats = new EntityStats(); 
    //Other stuff.... 
} 

而且......子類? (合適的名字,將不勝感激這個)...叫EntityStats

public class EntityStats : INotifyPropertyChanged 
{ 

    public int CurrentHealth 
    { 
     get { return _currentHealth; } 
     set 
     { 
      if (value != _currentHealth) 
      { 
       _currentHealth = value; 
       OnPropertyChanged("CurrentHealth"); 
      } 
     } 
    } 

    //other properties... 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, e); 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Entity對象包含EntityStats類型的屬性。

在我的代碼的另一邊,我註冊一個Entity對象監聽PropertyChanged事件:

public void RegisterEntity(Entity entity) 
{    
    entity.Stats.PropertyChanged += entity_PropertyChanged;   
} 

void entity_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "CurrentHealth") 
    { 
     Message.Write("CurrentHealth property changed!"); 
     DeathCheck((Entity)sender); 
    } 
} 

我遇到的問題與DeathCheck((Entity)sender); - 因爲CurrentHealthOnPropertyChanged事件是部分EntityStats類,該對象的類型爲EntityStats,其中只包含我需要的部分數據。

我如何確定Entity對象sender所屬的我怎麼能重構這個代碼,以便當內EntityStats變化的特性,在Entity類引發的事件?

+1

有很多方法可以做到這一點。在entitystat中創建父屬性並存儲實體對象。這樣你可以訪問entitiy屬性。不過,根據您的要求,我認爲從實體而不是entitystat公開事件會很有用。 – XtremeBytes

+0

@XtremeBytes感謝您的評論。你能否提供一個答案來展示如何從「實體」類暴露事件?這樣做對我來說最有意義,但是我不太清楚如何實現它,因爲CurrentHealth是EntityStats的一個屬性。 – levelonehuman

回答

4

你可以聽的EntityStats事件在實體構造並分派實體活動的。就像這樣:

public class Entity : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Entity() { 
     Stats.PropertyChanged += Stats_PropertyChanged 
    } 
    //Other stuff.... 

    void Stats_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      e.PropertyName = "Stats." + e.PropertyName; 
      PropertyChanged(this, e); 
     } 
    } 
} 

現在,在RegisterEntity,聽者方法可以關聯直接到實體實例:

public void RegisterEntity(Entity entity) 
{    
    entity.PropertyChanged += entity_PropertyChanged;   
} 

和偵聽器方法的發送者是實體實例,但可能確定屬性是否在Stats屬性中更改:

void entity_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Stats.CurrentHealth") 
    { 
     Message.Write("Stats.CurrentHealth property changed!"); 
     DeathCheck((Entity)sender); 
    } 
} 
+0

因此,這注冊了'Entity'對象來偵聽'EntityStats'上的'PropertyChanged'事件? – levelonehuman

+0

是的。就耦合而言,Entity已經具有EntityStats的依賴性。但EntityStats不需要實體的依賴。 –

1

你可以給EntityStats類名爲Entity屬性(或諸如此類),並設置在EntityStats構造函數性質:

public class Entity : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public EntityRole Role { get; set; }   
    public EntityStats Stats = new EntityStats(this); 
    //Other stuff.... 
} 

public class EntityStats : INotifyPropertyChanged 
{ 
    private Entity _entity; 

    public Entity Entity 
    { 
     get { return _entity; } 
    } 

    public EntityStats(Entity entity) 
    { 
     _entity = entity; 
    } 

    // ... 
} 
+0

欣賞答案,這是有道理的!從設計的角度來看,是否有任何問題有一個子類(或任何'EntityStats'將在這種情況下被調用..我不知道!)持有對其父項的引用? – levelonehuman

+0

取決於你是否會永遠想,例如,共享一個'兩個'Entity'對象之間EntityStats'或圍繞它傳遞給代碼,不應該知道它的父。 – adv12

+0

也許這是它開始設計的一個問題 - 「EntityStats」的基本概念是一組屬性('health','damage','defense'等),我將它們分解爲單獨的類,而不是將它們作爲「實體」類中的屬性列出。 – levelonehuman

相關問題