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

时间:2016-10-26 03:22:01

标签: c# inheritance polymorphism new-operator method-overriding

例如,

    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());
        }
    }

为什么答案是真的?什么"新Bar()"意思?没有"新的Bar()"只是意味着分配内存?

3 个答案:

答案 0 :(得分:5)

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

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

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

除非您使用虚拟/覆盖,否则C#仅考虑引用的类型。也就是说,任何类型“引用Foo”的变量都会调用Foo.DoSomething(),任何“对Bar的引用”都会调用Bar.DoSomething(),无论实际引用的对象是什么类型。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

Foo test = new Bar();

test指的是Bar的新对象,因此调用test.DoSomething()会调用对象DoSomething()的{​​{1}}。这返回true。