可能重复:
C# - Is there a better alternative than this to ‘switch on type’?的最佳方式基于类型
考虑经典:
class Widget { }
class RedWidget : Widget { }
class BlueWidget : Widget { }
在大多数情况下,在我的UI,我可以对待所有Widget
一样。但是,有一些细微的差异,我需要通过if
或switch
。
可能的方法:
枚举指标 - 通过构造方法设置
enum WidgetVariety { Red, Blue }
class Widget {
public WidgetVariety Variety { get; protected set; }
}
class RedWidget : Widget {
public RedWidget() {
Variety = Red;
}
}
// Likewise for BlueWidget...
switch (mywidget.Variety) {
case WidgetVariety.Red:
// Red specific GUI stuff
case WidgetVariety.Blue:
// Blue specific GUI stuff
}
使用is
Widget w = ...;
if (w is RedWidget) {
(RedWidget)w ...
}
else if (w is BlueWidget) {
(BlueWidget)w ...
}
我已经使出了这样做的原因是1)大多数代码已经有点用这种方式编写了,但更加丑陋。 2)90%的代码是相同的 - 基本上只需要根据类型对GridView中的一列进行不同的处理。
你会推荐哪个? (或任何人有更好的解决办法吗?)
编辑我知道我可能会建议访问者模式,但只是看起来复杂,在这种情况下稀疏的,微小的差异。
编辑2 所以我有一个特殊的区别是我很难整理出这两个类型不同的列。在一种情况下,它检索一个bool
值,并将其分配给网格单元格。在另一种情况下,它会得到一个字符串值。
我在这种情况下想,这应该是显而易见的,我可以定义:
public object virtual GetColumn4Data();
public override GetColumn4Data() { return m_boolval; }
public override GetColumn4Data() { return m_mystring; }
这起初我觉得不对劲,由于使用的object
。但是,是我分配给单元格的属性的类型,所以当然是这很有道理!
今天在办公室时间太长了......
听起来好像你说的是:由于大部分代码已经写得很差,你需要通过编写更难看的难以维护的代码来延续这一趋势。 – 2012-04-11 22:49:47
如果你的子类有一个不同的类型,那么也许基类应该是通用的。然后它变成'public virtual T GetColumn4Data(); ... public override bool GetColumn4Data(){return m_boolval; } ... public override string GetColumn4Data(){return m_mystring; }' – 2012-04-11 23:30:43
@Sahuagin - 请保存更大的代码片段以获取答案。评论不公平。 – 2012-04-11 23:57:31