确定对象的类型

Bru*_*ant 3 c# polymorphism

我再次希望这不是一个意见问题; 我试图知道哪种是确定属于C#中某个层次结构的对象类型的最佳方法.我有两种方法来设计我的应用程序:

1 - 在基类上使用属性:

public abstract class Parent 
{
    public abstract TypeOfObject TypeOfObject { get; }
}

public class Child1 : Parent
{
    public override TypeOfObject TypeOfObject { get { return TypeOfObject.Child1 } }

    // ...
}

public class Child2 : Parent
{
    public override TypeOfObject TypeOfObject { get { return TypeOfObject.Child2 } }

    // ...
}

public enum TypeOfObject 
{
    Child1,
    Child2
}

public static void Main()
{
    Parent p = new Child1();

    switch (p.TypeOfObject)
    {
        case TypeOfObject.Child1: _doSomethingWithChild1(p);break;
        case TypeOfObject.Child2: _doSomethingWithChild2(p);break;
    }
}
Run Code Online (Sandbox Code Playgroud)

2 - 使用is运算符

public abstract class Parent 
{
    // ...
}

public class Child1 
{
    // ...
}


public class Child2 : Parent
{    
    // ...
}

public enum TypeOfObject 
{
    Child1,
    Child2
}

public static void Main()
{
    Parent p = new Child1();

    if (p is Child1) _doSomethingWithChild1(p);
    if (p is Child2) _doSomethingWithChild2(p);
}
Run Code Online (Sandbox Code Playgroud)

每种选择的含义是什么?我认为2由于依赖于元数据而具有更大的性能,但是1似乎不那么优雅.此外,我学会了用C++编写的这种方法......我不确定是否有必要用C#这样做.

编辑1:

我已将override关键字添加到上面的代码中.

编辑2:

对不起,我可能没说清楚.我会更好地说明一下:

例如,我有一个WPF Panel对象,它有一个Children属性,返回给我UIElement.我需要知道某个元素在什么类型上行动...在我的特定情况下,用户在屏幕上绘制图形,所以我需要知道有多少节点和多少个连接被绘制以便存储然后在数据库.不幸的是,我不能使用多态性,对吗?我怎么知道是否应该在我的节点表或连接表中添加一行?

小智 10

你做错了™.曾经听说过多态(迟到/动态绑定更准确)?父母应该有一个抽象的方法,比如doSomething()由孩子们实现,无论_doSomethingWithChild1应该Child1.doSomething是什么,等等.这就是OO的全部 - 好吧,不是全部,而是在很大程度上 - 关于!C++ FAQ是正确的,声称C++不会没有面向对象virtual.不仅更容易/更不容易出错添加另一个孩子(你只需定义一个新的子类和方法,不需要摆弄开关或ifs)并且很可能以最快的方式(每个JIT值得它的盐使用多态内联缓存)),它也是惯用的,不太可能让你"WTF"盯着;)