2010-11-22 3 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"); 
    } 
} 

これはokですが、派生クラスは、基本クラスで定義されてマイリストを満たす基本クラスを持っているとしましょう。

しかし、抽象メソッド名(FillMyList)のほかに、実際にMyListを埋めなければならないことを示唆していますが、このメソッドが意味するものには何の手がかりもありません。

Baseから継承しているときにMyListを埋める必要があることを強く示唆する(より良い)方法がありますか?あなたは何を示唆するか

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

: はたぶんFillMyListのように宣言しましたか?

答えて

3

あなたが派生ゲッターと抽象プロパティに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 
} 
+0

抽象メソッドとプロパティはどちらも同じ効果をもたらします。つまり、実装しなければなりません。 – TalentTuner

+0

こんにちはナグ、それはトリックです。ありがとう。 @saurabh:真が、これは何かを、実際に(たとえ空であっても)のリストを返すために派生を強制します。 – sh0uzama

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"; 
    } 
} 

がこれを行った、あなたの要件に応じて、privateFillMyListを変更することが適切です。また、Derivedのメソッドはoverrideとマークする必要があります。

もちろん、これを達成するにはさまざまな方法があります。たとえば、Naggが提案するように、MyListプロパティを抽象的なものにすることができます。

+0

ありがとう、あなたの答えはまた非常に興味深いです:) – sh0uzama

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>(); 
} 

あなただけのチェックを行いますプロパティを通じてマイリストにアクセスすることができ派生。

関連する問題