ここで私のビジョンを説明するために最善を尽くします。これは非常に不完全な作り上げの例です。私はいくつかの異なるタイプを持ってBag
います、そしてそれらはすべて彼ら自身の特別なタイプを持っていMarble
ます。の各タイプにMarble
は、独自のニックネームのセット(string
s)があります。
残念ながら、Marble in the Bag以外にも他のものがあるので、ジェネリックはここでは役に立ちません。
// Bags
abstract class Bag {
protected Type MarbleType { get; }
protected List<Marble> _marbles;
public void DumpBag()
{ ... }
}
class RedBag : Bag {
override Type MarbleType { get { return typeof(RedMarble); } }
}
class BlueBag : Bag {
override Type MarbleType { get { return typeof(BlueMarble); } }
}
// Marbles
abstract class Marble {
public static IEnumerable<string> Nicknames {
get {
return new List<string>() {
"Marble", "RollyThing"
}
}
}
}
class RedMarble : Marble {
public static IEnumerable<string> Nicknames {
get {
return new List<string>(Marble.Nicknames) {
"Ruby"
};
}
}
}
class BlueMarble : Marble { ... }
さて、詳細、の実装について説明しDumpBag()
ます。次の呼び出しについて考えてみます。
Bag b = new RedBag();
b.GetMarbles();
b.DumpBag();
印刷したい:
Bag of Marbles (aka "Marble", "RollyThing", Ruby"):
- Marble 1
- Marble 2
...
その見出しを印刷するには、実際のインスタンスに関係なく、Bag
派生したタイプの知識を持っている必要があることがわかります。基本クラスのの連結だけでなく、派生したもMarble
取得します。Nicknames
Marble
RedMarble
DumpBag
一種の「静的仮想呼び出し」を行う必要があります。私はDumpBag
以下から実装を開始しました:
public void DumpBag() {
PropertyInfo pi = this.MarbleType.GetProperty("Nicknames", BindingFlags.Static);
IEnumerable<string> nicknames = pi.GetValue(null, null); // No instance
StringBuilder sb = new StringBuilder("Bag of Marbles (aka ");
foreach (string nn in nicknames)
sb.Append("\"" + nn + "\", ");
Console.WriteLine(sb.ToString());
...
}
私の質問:
- これは正気ですか?うまくいけば、私がこのルートを選んだ理由を説明することができます(またはできる)。
RedMarble.Nicknames
(もちろん)非表示の警告が表示されMarble.Nicknames
ます。先に進んでマークを付けることは有効だと思われますnew
か?