2014-01-05 64 views
1

我正在寫圖書館和我的客戶使用我的圖書館。如何從我的父類通知客戶的子類屬性更改?

我的客戶創建自己的類派生自我的基類。

我可以檢測到我的客戶的類屬性已更改嗎?

我不希望我的客戶實現INotifyPropertyChanged。

我也使用反射用於其他目的。爲什麼反射無法檢測屬性更改狀態?

我的圖書館代碼:

public class BaseClass 
{ 
    public void ChildPropertyChanged(propinfo...) 
    { 
     ... 
    } 
} 

客戶端的代碼:

public class MyClass : BaseClass 
{ 
    public string Name {get;set;} 
} 
+0

他們的派生類只會覆蓋你在基類中的一些虛擬方法嗎?或者他們可以將他們想要的任何東西放到派生類中? –

+0

晚餐班不應該知道子類。 –

+0

客戶端不會覆蓋我的方法。是的客戶可以投入很多,但通常這個類不是複雜的只有屬性和一些方法可能。 – volkans80

回答

0

您的客戶必須合作,這意味着他們將不得不編寫代碼,以幫助您捕捉性質的變化,如INotifyPropertyChanged的客戶(實施者)必須引發一個事件(RaisePropertyChanged);

如果你想想看,如果你問是可能的,比INotifyPropertyChanged的是沒有必要的..

你一個可能的解決方案是定義在基類的事件,並引導你的客戶提高它在屬性getter中,或者甚至更好 - 調用一個基類處理方法。

+0

我很好奇有沒有一種方法來實現沒有INotifyPropertyChanged? – volkans80

0

您可以實施template模式。

基類。

public class BaseClass 
{ 
    protected string name; 

    private void NameChanged() 
    { 
     ... 
    } 

    public void SetName(string value) 
    { 
     this.name = value; 
     this.NameChanged(); 
    } 
} 

派生類:

public class MyClass : BaseClass 
{ 
    public string Name 
    { 
     get 
     { 
      return this.name; 
     } 

     set 
     { 
      this.SetName(value); 
     } 
    } 
} 

雖然做這種方式消除了在派生類物業的需求 - 它可以使用基類方法SetName改變。

+0

我如何知道派生類中將實現什麼?這是不可能的。 – volkans80

+0

他們將添加自己的屬性,你無法控制它?如果是這樣,那麼不確定是否可以不使用'INotifyPropertyChanged'。如何編寫一個'PropertyChanged'事件並要求他們在必要時使用前後值或EventArgs'來提高它。 – PeteGO