![](/img/trans.png)
[英]How to Implement a Base Class with a Method and yet force the Derived Class to Override it?
[英]How to force a derived class to fill a list defined in the base class?
這是與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);
你有什么建議?
您可以使用getter將MyList轉換為抽象屬性,該屬性必須實現
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
}
您可以這樣做:
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。
您如何定義“填充”? 如果您只是想“添加一些元素”,則可以簡單地添加另一個抽象方法來檢索要添加的項目,然后在基類中實現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";
}
}
完成此操作后,根據您的要求將FillMyList
更改為private
可能是適當的。 還要注意,“ Derived
中的方法必須標記為“ override
。
當然,有許多不同的方法可以實現這一目標。 您可以簡單地使MyList
屬性本身抽象化,例如,如Nagg所建議的。
我認為,如果出現問題(即列表未正確填充),則在嘗試使用它時應該拋出異常。 這樣,您將始終獲得正確的數據。 即使該類是抽象的,用戶也可以將其實現為空方法,因此效果並不好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.