私はここで私のビジョンを説明するために最善を尽くすつもりです。これは非常に不自由な構成例です。私はBag
のいくつかの異なるタイプを持っていて、それらはすべてMarble
の独自の特殊タイプを保持しています。 Marble
の各タイプにはニックネーム(string
秒)があります。リフレクションを使用して静的プロパティ値を取得すると、派生クラスと基底クラスの連結
残念ながら、マーブル・イン・ザ・バッグ以外にも、ジェネリック医薬品は私を助けません。
// 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
、実際のインスタンスから独立しています。 Marble
基本クラスのNicknames
の連結を取得しますが、派生した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
とマークするのが有効なようですか?あなたが不足しているすべての明示キャストで見つけることができます
'Marble.Nicknames' - >' Marble.BaseNicknames'の名前の変更とは別に、あなたのコードの例は私のものとまったく異なりますか?連結は、あなたが 'RedMarble.Nicknames'でそれを持っているのとまったく同じです。 –
私のリフレクションは、 'Bag'自体が扱っている' Marbles 'の型を知らないので、 'Type'を取得するために仮想プロパティを使用し、静的プロパティを取得するためにリフレクションを使用しますそのタイプから。 –
あなたのコードの一部を見逃していなければなりません - あなたが 'Marble.Namesnames'ではなく' Marble.Namesnames'を持っていることに注意してください。あなたの質問のパート2に答えるには、それを新しいものにしないでください。これは本当に継承ではありません。 – yamen