我将尽我所能在这里解释我的愿景。这是一个非常蹩脚的虚构例子。我有几种不同类型的Bag
s,它们都有自己特殊类型的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
吗?