例如,
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()"只是意味着分配内存?
答案 0 :(得分:5)
new Bar()
实际上创建了一个Bar类型的新对象。
virtual
/ override
和new
(在方法覆盖的上下文中)之间的区别在于您是否希望编译器考虑引用的类型或对象的类型,用于确定要执行的方法。
在这种情况下,您有一个名为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。