簡體   English   中英

如何強制派生類填充基類中定義的列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM