古典を考えてみましょう:
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 の 1 つの列だけをタイプに応じて異なる方法で処理する必要があります。
どちらをお勧めしますか?(または、誰かがより良い解決策を持っていますか?)
編集私はおそらく訪問者パターンに推奨されることを知っていますが、この場合、まばらで小さな違いのために単純に複雑に思えます。
編集2
したがって、私が整理するのに苦労していた特定の違いの1つは、2つのタイプ間で異なるこの列です。あるケースでは、bool
値を取得し、それをグリッド セルに割り当てます。それ以外の場合は、文字列値を取得します。
この場合、次のように定義できることは明らかだと思います。
public object virtual GetColumn4Data();
public override GetColumn4Data() { return m_boolval; }
public override GetColumn4Data() { return m_mystring; }
を使用しているため、これは最初は間違っていると感じましたobject
。しかし、それは私がセルで割り当てているプロパティのタイプなので、もちろんこれは理にかなっています!
今日はオフィスにいる時間が長すぎるようです...