C#调用重写的子类方法,而不知道它是一个子类实例

时间:2008-12-23 23:07:52

标签: c# inheritance virtual override subclass

我有一个带有虚方法的基类,以及覆盖该方法的多个子类。

当我遇到其中一个子类时,我想调用重写的方法,但不知道子类。我可以想到这样做的丑陋方法(检查一个值并投射它),但似乎应该有一种语言方式来做到这一点。我希望List在同一个列表中包含多个子类,否则显然我只能创建一个List。

编辑:修复了错误代码中的注释,这导致我得到了非常合适的第一个答案:)

例如:

Class Foo 
{
    public virtual printMe()
    {
        Console.Writeline("FOO");
    }
}

Class Bar : Foo 
{
    public override printMe()
    {
        Console.Writeline("BAR");
    }
}

List<Foo> list = new List<Foo>();
// then populate this list with various 'Bar' and other overriden Foos

foreach (Foo foo in list) 
{
    foo.printMe(); // prints FOO.. Would like it to print BAR
} 

5 个答案:

答案 0 :(得分:8)

class Foo 
{
    public virtual void virtualPrintMe()
    {
        nonVirtualPrintMe();
    }

    public void nonVirtualPrintMe()
    {
        Console.Writeline("FOO");
    }
}

class Bar : Foo 
{
    public override void virtualPrintMe()
    {
        Console.Writeline("BAR");
    }
}

List<Foo> list = new List<Foo>();
// then populate this list with various 'Bar' and other overriden Foos

foreach (Foo foo in list) 
{
    foo.virtualPrintMe(); // prints BAR or FOO
    foo.nonVirtualPrintMe(); // always prints FOO
}

答案 1 :(得分:1)

为什么要打印“Foo”?这不是虚方法的目的。重点是派生类可以在不改变界面的情况下改变函数的工作方式。 Foo对象将打印“Foo”,Bar对象将打印“Bar”。别的什么都不对。

答案 2 :(得分:0)

使用 new 修饰符显式隐藏从基类继承的成员。要隐藏继承的成员,请使用相同的名称在派生类中声明它,并使用new修饰符对其进行修改。这将导致您想要的行为。

有关详细信息,请转到此处:http://geekswithblogs.net/Mohamed/articles/28613.aspx

答案 3 :(得分:0)

要在这种情况下获得所需的行为,您可以删除基类上的虚拟对象并在子类上使用new。

然而,就像Ed Swangren所说,你为什么要这样做?

答案 4 :(得分:0)

是否有解决方案,您只需要转换要调用另一个对象的对象:

 foo.printMe(); // prints FOO.. Would like it to print BAR

变为

(Foo)foo.printMe(); // foo can be any derived class of Foo.

或者我错过了部分问题?