2013-04-17 70 views
2

我有一個通用的'設備'類型的抽象基類,並希望要求派生的特定設備類根據其各自的區別初始化列表。摘要字段是不允許的。我如何強制派生類來實例化/初始化一個字段?

當將派生類設置爲活動狀態時,它必須通過列表將參數設置爲活動狀態。每個派生類將自己的參數插入到列表中。

下面是相關代碼:

基類:

 abstract public class Device : Common, IDisposable 
     { 
      abstract public Boolean bActive 
      { 
      get; 
      set; 
      } 

      abstract List<Parameters> ActiveParameters; 
      ... 
     } 

我不想初始化列表中的基類,因爲我不知道哪些參數會被插入到你派生類的列表。此代碼產生一個錯誤,說我不能有一個抽象字段,我明白,但有沒有辦法要求派生類從基類初始化一個字段?

+3

這個問題的前提是基類是派生類的「主人」:即它可以對他們施加限制,並迫使他們以某種方式行事。你發現很難做到這一點,因爲這實際上並不是基類和派生類之間的關係。基類是派生類的僕人;它提供了一個服務,並且派生類在他們認爲合適的時候使用該服務。 –

回答

2

如果這是有關初始化列表中,那麼你就可以強制,通過加入該列表到構造函數(或所有構造函數,如果你有更多的人)的基類。

喜歡的東西:

public abstract class Device : Common, IDisposable 
{ 
    protected Device(List<Parameters> activeParameters) 
    { 
     ActiveParameters = activeParameters; 
    } 

    protected List<Parameters> ActiveParameters { get; private set; } 
} 

派生類將被再用力做這樣的事情:

public class ConcreteDevice : Device 
{ 
    public ConcreteDevice() 
     : base(new List<Parameters>()) 
    {} 
} 
+0

有趣。這將要求執行該課程的任何人都瞭解該要求。我會給這個鏡頭。謝謝。 – CramerTV

+1

@CramerTV你是什麼意思?如果他們沒有意識到需求,他們不會在構造函數中調用'base()',但該代碼不會編譯。 – svick

+0

這就是我的意思。如果他們的代碼不能編譯,他們必須找出原因並意識到他們需要初始化該類,因此希望能夠引導他們理解他們需要在該領域做些什麼。 (當我說'他們'時,我的意思是*我*。這只是一種迫使我記住做一些事情的方法,然後它會導致一個我必須稍後想到的錯誤。) – CramerTV

1

此代碼產生一個錯誤,說我不能有一個抽象字段,我明白,但有沒有辦法要求派生類從基類初始化字段?

如果這需要實施,它應該是您的API的一部分。爲了解決這個問題,你可以使這個保護屬性。這將迫使它由所有派生類實現。

protected abstract List<Parameters> ActiveParameters { get; } 
+0

我並不是真的希望'獲得'列表,而是添加和刪除成員,並能夠遍歷它。我想我可以'得到'列表,然後添加/刪除/迭代,但我有點希望有點不同。也許這就是全部。感謝您的建議。 – CramerTV

+0

@CramerTV要添加或刪除列表中的項目或迭代它,首先需要以某種方式「獲取」它。 – svick