2015-11-20 61 views
0

我有一個具有屬性列表的類,屬性本身具有屬性列表。我需要「孫子」 - 財產能夠從其父母的父母請求數據(抱歉,令人困惑的條款 - 這裏沒有繼承)。爲了澄清:在運行時通過屬性滲透數據

class ClassA 
{ 
list<ClassB> Children 
var SomeOtherProperty 
} 

class ClassB 
{ 
list<ClassC> Grandchildren 
} 

class ClassC 
{ 
var GetSomeOtherProperty() 
{ 
    ... 
} 
} 

的數據可能會改變,所以我不能只是通過了一次,用它做,我得能夠動態地得到它。

我總是可以把父母一路傳給孫子孫女,但我被教導這是一種不好的習慣,所以我寧願避免它。

我一直在閱讀關於通過事件使用可變EventArguments傳遞數據返回/向下 - 我想知道如果這是一個好的解決方案,我已經有了(我需要每次做兩次 - 追逐第一個eventarg的尾巴)。我需要注意哪些缺陷?

我對這種情況有其他選擇嗎?

謝謝!

+0

孩子,父母和祖父母的名字在你的問題中有點誤導。他們是衍生品嗎?那麼'ClassC'是否延伸'ClassB'而'ClassB'延伸'ClassA'?我想有一個與另一個組成,但沒有通過繼承鏈接。我是對的嗎? – Kapoor

+0

@卡普爾正確。他們只是屬性 - 我會編輯澄清。 – Oyiwai

回答

0

如果可能,您可以使用設計模式組合。首先,創建一個基本類「筆記」,其中包含子筆記列表和一個虛擬方法「DoAction」。然後從這個類派生所有其他類,並用自己的實現重寫該方法。

現在你可以建立一個筆記樹並對它的所有孩子進行遍歷。對於他們每個人,請致電'DoAction'。

希望你的想法...

0

由於類A,B & C不被通過繼承喜歡,所以,我想避免這些類之間的直接連線,因爲它會使得設計有點隨着系統的發展而變得複雜。此外,由於B類與數據無關,我不希望它受到它的影響。

因此,我想借此出通過單獨的途徑,以保持鬆散耦合的類的溝通 - enter image description here

這裏是一個示例代碼來解釋我的想法 -

 public interface IPublisher 
     { 
     event EventHandler OperationOccurred; 
     } 

     class ClassA : IPublisher 
     { 

      List<ClassB> Children; 

      event EventHandler OperationOccurred; 

     public ClassA() 
      { 
       BroadCaster.Instance.RegisterPublisher(this); 
      } 

      protected virtual void OnOperationOccurred() 
      { 
       if (OperationOccurred != null) 
        OperationOccurred(this, new EventArgs()); 
      } 

     } 

     class ClassB 
     { 
      List<ClassC> Grandchildren; 
     } 

     class ClassC 
     { 
      public ClassC() 
      { 
       BroadCaster.Instance.BroadCastNotificaiton += Instance_OperationOccurred; 
      } 

      void Instance_OperationOccurred(object sender, EventArgs e) 
      { 
       throw new NotImplementedException(); 
      } 
     } 



    /// <summary> 
    /// A singleton class ... Like a single braodcast tower just one in the city 
    /// </summary> 
    public sealed class BroadCaster 
    { 
     public static BroadCaster Instance { get; private set; } 

     //Static constructor 
     static BroadCaster() 
     { 
      Instance = new BroadCaster(); 
     } 

     // private constructor 
     private BroadCaster(){} 

     public event EventHandler BroadCastNotificaiton; 

     public void RegisterPublisher(IPublisher publisher) 
     { 
      publisher.OperationOccurred += Publisher_OperationOccurred; 
     } 

     void Publisher_OperationOccurred(object sender, EventArgs e) 
     { 
      if (this.BroadCastNotificaiton != null) 
       this.BroadCastNotificaiton(sender, e); 
     } 



    } 

我已經實現廣播員是一個單身的對象,但我想傳達的只是一個單一的交流點。

希望它有幫助。