2016-09-27 67 views
0

我有一個設計問題。可以說我有一個基類和許多派生類。在派生類構造函數後運行一些東西

class MyBase 
{ 
    MyBase() 
    { 
     Record(); 
    } 

    void Record() 
    { 
     /// this line is able to handle every object 
     Recorder.Process(this); 
    } 
} 

class DerivedA : MyBase 
{ 
    public int SpecialPropertyOfA { get; set; } 
    DerivedA(int specialPropertyOfA) 
    { 
     SpecialPropertyOfA = specialPropertyOfA; 
    } 
} 

class DerivedB : MyBase 
{ 
    public string SpecialPropertyOfB { get; set; } 
    DerivedA(string specialPropertyOfB) 
    { 
     SpecialPropertyOfB = specialPropertyOfB; 
    } 
} 

正如你可能推論的那樣,我想記錄派生類的所有屬性設置。但是上面的例子不能記錄派生類的特殊屬性,因爲它們在Record方法調用時沒有設置。

解決此問題的一種方法是製作Record方法protected並將其稱爲派生類構造函數的最後一行。但這違反了我的基本原則(每個派生類都應該在初始化後立即記錄下來)。我想通過設計來製作這款腕錶。

任何方式來處理?

+0

不可能的。唯一的方法就是通過Factory來做到這一點。對我來說,錄音功能不合適,看起來你的班級做得比應該多。 – RvdK

+1

如果您將Record作爲接口/抽象並在每個Derive類中實現,該怎麼辦? (你如何使用記錄中的特殊道具?) –

回答

1

再次看看你正在嘗試做什麼。

請記住,在派生類的構造函數之前,基類構造函數被調用之前

MyBase() 
{ 
    Record(); 
} 

void Record() 
{ 
    Recorder.Process(this); // <-- What is "this" ? 
} 

這個時候this的值是多少?

該實例尚未構造,派生類的構造函數未事件調用,因此沒有提及this,因此,您不能在此處使用它。

您必須調用此方法該實例已完全構建。


克服這一點的方法是使用一個工廠方法:

public static class MyBaseFactory 
{ 
    public static MyBase CreateDerivedA() 
    { 
     int specialPropertyOfA = // ... 
     MyBase instance = new DerivedA(specialPropertyOfA); 
     Recorder.Process(instance); 
     return instance; 
    } 

    public static MyBase CreateDerivedB() 
    { 
     string specialPropertyOfB = // ... 
     MyBase instance = new DerivedB(specialPropertyOfA); 
     Recorder.Process(instance); 
     return instance; 
    } 
} 
+0

我知道'this'不存在,因爲我需要它。正在尋找解決方法,雖然你基本上提供了它。謝謝。 –