我有一个带有虚方法的基类,以及覆盖该方法的多个子类。
当我遇到其中一个子类时,我想调用重写的方法,但不知道子类。我可以想到这样做的丑陋方法(检查一个值并投射它),但似乎应该有一种语言方式来做到这一点。我希望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
}
答案 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.
或者我错过了部分问题?