c#继承和重写时的new in对象声明

本文关键字:new in 对象 声明 继承 重写 | 更新日期: 2023-09-27 18:14:51

例如

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()"的意思不就是分配内存吗?

c#继承和重写时的new in对象声明

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

virtual/overridenew之间的区别(在方法覆盖的上下文中)是您希望编译器在确定执行哪个方法时考虑引用的类型还是对象的类型

在本例中,您有一个名为test的"对Foo的引用"类型的引用,并且该变量引用了一个Bar类型的对象。因为DoSomething()是虚的并且被重写了,这意味着它将调用Bar的实现而不是Foo的实现。

除非使用virtual/override,否则c#只考虑引用的类型。也就是说,任何"对Foo的引用"类型的变量都会调用Foo. dosomething(),而任何"对Bar的引用"都会调用Bar. dosomething(),无论实际引用的对象是什么类型。

new Bar()表示创建一个新的Bar对象并调用默认构造函数(在本例中不做任何事情)。

它返回true,因为test.DoSomething()返回true,因为它对Foo实现有覆盖(因此不会调用Foo实现)。

Foo test = new Bar();

test引用Bar的新对象,因此调用test.DoSomething()调用对象BarDoSomething()