继承和覆盖时对象声明中的 C# new

C# new in object declaration when inherit and override

例如,

public class Foo
{
    public virtual bool DoSomething() { return false; }
}

public class Bar : Foo
{
    public override bool DoSomething() { return true; }
}

public class Test
{
    public static void Main()
    {
        Foo test = new Bar();
        Console.WriteLine(test.DoSomething());
    }
}

为什么答案是正确的? "new Bar()" 是什么意思? "new Bar()"不就是分配内存吗?

new Bar() 表示创建一个新的 Bar 对象并调用默认构造函数(在这种情况下不执行任何操作)。

它 returns true 因为 test.DoSomething() returns true,因为它有 Foo 实现的覆盖(所以 Foo 实现不会被调用)。

Foo test = new Bar();

test 指的是 Bar 的新对象,因此调用 test.DoSomething() 调用对象 BarDoSomething()。这个returns是真的。

new Bar() 实际上创建了一个 Bar 类型的新对象。

virtual/overridenew 之间的区别(在方法覆盖的上下文中)是您是否希望编译器考虑 [=24= 的类型]reference 或 object 的类型决定执行哪个方法。

在这种情况下,您有一个名为 test 的 "reference to Foo" 类型的引用,并且此变量引用了一个 Bar 类型的对象。因为 DoSomething() 是虚拟的并且被覆盖了,这意味着它将调用 Bar 的实现而不是 Foo 的实现。

除非你使用virtual/override,否则C#只考虑引用的类型。也就是说,任何 "reference to Foo" 类型的变量都会调用 Foo.DoSomething() 而任何 "reference to Bar" 都会调用 Bar.DoSomething() 而不管实际引用的对象是什么类型。