public void ControlStuff()
{
var listOfThings = LoadThings();
var listOfThingsThatSupportX = new string[] {"ThingA","ThingB", "ThingC"};
foreach (var thing in listOfThings)
{
if(listOfThingsThatSupportX.Contains(thing.Name))
{
DoSomething();
}
}
}
我建议我们在“Things”基类中添加一个属性,以告诉我们它是否支持X,因为Thing子类需要实现相关的功能。像这样:
public void ControlStuff()
{
var listOfThings = LoadThings();
foreach (var thing in listOfThings)
{
if (thing.SupportsX)
{
DoSomething();
}
}
}
class ThingBase
{
public virtual bool SupportsX { get { return false; } }
}
class ThingA : ThingBase
{
public override bool SupportsX { get { return true; } }
}
class ThingB : ThingBase
{
}
所以,第一种方法为什么不好是很明显的,但这被称为什么?此外,有没有比我建议的更适合这个问题的模式?
X
的不同,你的建议可能会因为不同的原因与硬编码O(n^2)方法一样具有问题。你将关于X
的知识强制放入基类中,因此在创建每个派生类时(无论它是否支持X)都需要这些知识。对于那些与X完全无关的“Thing”类型,"SupportsX()"方法只是公共接口中的污染。如果你有许多不同的特性(SupportsY()
,SupportsZ()
等),这种污染会很快变得极其严重。可以考虑使用泛型测试Supports(X)
或者使用接口来标记特性支持。 - Lee