2010-11-22 71 views
1

這是C#相關的,但實際上這個問題是非常通用的。如何強制派生類填充基類中定義的列表?

比方說,我有一個基類

abstract class Base { 
    protected List<string> MyList = new List<string>(); 
    protected abstract void FillMyList(); 
} 

class Derived : Base { 
    protected void FillMyList() { 
     MyList.Add("test"); 
     MyList.Add("test2"); 
    } 
} 

這是確定的,派生類填補了基類中定義的MYLIST。

但是,除了抽象方法名稱(FillMyList) - 提示您實際上需要填充MyList - 這種方法應該表示什麼不知道。

有沒有更好的方式強制執行或(更好地)建議您在從Base繼承時必須填寫MyList? 也許具有FillMyList聲明:

protected abstract void FillMyList(List<string> listToFill); 

你有什麼建議?

回答

3

可以MYLIST轉換爲抽象屬性與getter方法,得出必須實現

public abstract class Base 
{ 
    public abstract List<int> List { get; } 
} 

public class Derived : Base 
{ 
    #region Overrides of Base 

    public override List<int> List 
    { 
     get { return new List<int> {1, 2, 3}; } 
    } 

    #endregion 
} 
+0

抽象方法和屬性都給出了相同的效果,即「必須實現它」 – TalentTuner 2010-11-22 09:37:41

+0

嗨Nagg,這是訣竅。謝謝。 @saurabh:true,但這會強制Derived執行某些操作並實際返回列表(即使爲空)。 – sh0uzama 2010-11-22 10:13:14

1

你如何定義「填充」?如果您只是指「添加一些元素」,那麼您可以簡單地添加另一種抽象方法來檢索要添加的項目,然後在基類中實施FillMyList以將其添加到列表中。例如:

abstract class Base 
{ 
    protected List<string> MyList = new List<string>(); 

    protected abstract IEnumerable<string> GetItems(); 

    protected void FillMyList() 
    { 
     MyList.AddRange(GetItems()); 
    } 
} 

class Derived : Base 
{ 
    protected override IEnumerable<string> GetItems() 
    { 
     yield return "test"; 
     yield return "test2"; 
    } 
} 

已經做到了這一點,它可能是適當改變FillMyListprivate,根據您的要求。另請注意,Derived中的方法必須標記爲override

當然有許多不同的方法可以實現這一點。例如,您可以簡單地使MyList屬性本身爲抽象,如Nagg所建議的。

+0

謝謝你,你的回答也非常有趣:) – sh0uzama 2010-11-22 10:14:22

0

我認爲,如果事情是錯誤的(即列表中沒有正確填寫),那麼你應該什麼時候拋出一個異常正在嘗試使用它。這樣你總能得到正確的數據。即使這個類是抽象的,用戶也可以將它實現爲一個空方法,所以這並不好。

1

你可以做類似的東西:

abstract class Base { 
    protected List<string> TheList 
    { 
     get { 
      Debug.Assert(MyList.Count != 0); 
      return MyList; 
     } 
     set { 
      Debug.Assert(value.Count != 0); 
      MyList = value; 
     } 
    } 
    private List<string> MyList = new List<string>(); 
} 

派生只能通過,將做檢查的屬性訪問MYLIST。

相關問題