【发布时间】:2012-04-24 07:04:11
【问题描述】:
可能重复:
C# - Is there a better alternative than this to ‘switch on type’?
考虑经典:
class Widget { }
class RedWidget : Widget { }
class BlueWidget : Widget { }
在大多数情况下,在我的 UI 中,我可以一视同仁地对待所有 Widgets。但是,有一些细微的差异,我需要通过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,最初我觉得这不对。但是,是我在单元格中分配给的属性的类型,所以当然这是有道理的!
今天似乎在办公室太久了……
【问题讨论】:
-
听起来你的意思是:由于大部分代码已经写得很糟糕,你需要通过编写更难看的难以维护的代码来延续这种趋势。
-
如果您的子类的类型在它们之间有所不同,那么基类可能应该是通用的。然后变成
public virtual T GetColumn4Data(); ... public override bool GetColumn4Data() { return m_boolval; } ... public override string GetColumn4Data() { return m_mystring; } -
@Sahuagin - 请保存更大的代码 sn-ps 以获得答案。评论不公平。
标签: c# polymorphism