关于继承:继承和重写时在对象声明中新建

c# new in object declaration when inherit and override

例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    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类型对象。

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

在这种情况下,有一个名为test的"对foo的引用"类型的引用,这个变量引用了一个bar类型的对象。由于DoSomething()是虚拟的并被重写,这意味着它将调用bar的实现,而不是foo的实现。

除非使用虚拟/重写,否则C只考虑引用的类型。也就是说,"引用foo"类型的任何变量都将调用foo.dosomething(),而任何"引用bar"类型都将调用bar.dosomething(),无论被引用的对象实际上是什么类型。


1
Foo test = new Bar();

test指的是Bar的一个新对象,因此称为test.DoSomething()称为Bar对象的DoSomething()。这将返回真值。


new Bar()意味着创建一个新的Bar对象并调用默认的构造函数(在这种情况下,它什么也不做)。

它返回true,因为test.DoSomething()返回true,因为它具有对Foo实现的重写(因此不会调用Foo实现)。