【发布时间】:2020-01-09 15:20:13
【问题描述】:
当此代码运行时,输出是 "Child running",即使我将其强制转换为 Parent 类?我可能做错了,如果是这样,我怎样才能达到输出“父母运行”的预期结果? Parent instance = new Child(); 必须保持这样。
class Program
{
class Parent
{
public virtual void Run()
{
Console.WriteLine("Parent running.");
}
}
class Child : Parent
{
public override void Run()
{
Console.WriteLine("Child running.");
}
}
static void Main(string[] args)
{
Parent instance = new Child();
(instance as Parent).Run();
Console.ReadLine();
}
}
编辑:
注意到如果我从 Parent 类中删除 virtual 关键字并将此方法的 Child 版本标记为 new 它“解决”了问题。
class Program
{
class Parent
{
public void Run()
{
Console.WriteLine("Parent running.");
}
}
class Child : Parent
{
public new void Run()
{
Console.WriteLine("Child running.");
}
}
static void Main(string[] args)
{
Parent instance = new Child();
(instance as Parent).Run();
Console.ReadLine();
}
}
【问题讨论】:
-
virtual方法就是这样工作的,这几乎总是所需的行为。如果您不希望它是虚拟的,可以尝试去掉virtual关键字,但这通常是代码异味。 -
强制转换对象不会改变对象的类型,你的实例仍然是
Child,所以会运行child的实现。 -
@JonathonChase 不完全正确。正如 JL 所说,如果省略 virtual 关键字,则不会创建虚拟表,它将使用父实现。
-
检查this out。我什至可以把你的问题作为那个问题的副本来结束。
-
@Divisadero 是的,您可以插入一个新方法而不是覆盖一个虚拟方法,但尽管进行了强制转换,但实例仍将键入为
Child。
标签: c# oop inheritance casting