c# - 根据类型切换行为的最佳方式

标签 c# polymorphism

<分区>

Possible Duplicate:
C# - Is there a better alternative than this to ‘switch on type’?

考虑经典:

class Widget { }
class RedWidget : Widget { }
class BlueWidget : Widget { }

在大多数情况下,在我的 UI 中,我可以同样对待所有 Widget。但是,存在细微差异,我需要通过 ifswitch 来解决。

可能的方法:

枚举指标 - 由构造函数设置

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
}

使用

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,最初我觉得这是错误的。但是, 是我在单元格中分配给的属性类型,所以当然这是有道理的!

今天在办公室似乎太久了......

最佳答案

还有一种可能。使用虚拟调度:

class Widget
{
    public virtual void GuiStuff() { }
} 
class RedWidget : Widget
{
    public override void GuiStuff()
    {
        //... red-specific GUI stuff
        base.GuiStuff();
    }
} 
class BlueWidget : Widget
{
    public override void GuiStuff()
    {
        //... blue-specific GUI stuff
        base.GuiStuff();
    }
} 

关于c# - 根据类型切换行为的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115028/

相关文章:

c# - UWP C# 滚动到 TextBox 的底部

c# - 在 Binding 项目中实现 MKAnnotation 协议(protocol)

java - 这是否使用工厂设计模式? ( java )

c++ - 使用多态时在子对象之间转换?

java - 多态性? C++ 与 Java

java - 阐述 : Method overloading is a static/compile-time binding but not polymorphism. 将静态绑定(bind)与多态性相关联是否正确?

c++ - base 和 derived 之间的 "IS A"关系是什么意思?

c# - 在方法中抛出异常会导致方法返回吗?

c# - 编译器提示未分配的结构变量,但允许分配成员 - 为什么?

c# - 如何在C#中标准化WAV文件量?