可能重複:
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