例如,
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()”是不是意味着分配内存?
3 回答
new Bar()
实际上是一个Bar类型的新对象 .virtual
/override
和new
(在方法覆盖的上下文中)之间的区别在于您是否希望编译器在确定执行哪种方法时考虑 reference 的类型或 object 的类型 .在这种情况下,您具有名为
test
的"reference to Foo"类型的引用,并且此变量引用Bar类型的对象 . 因为DoSomething()
是虚拟的并且被覆盖,这意味着它将调用Bar 's implementation and not Foo' .除非您使用虚拟/覆盖,否则C#仅考虑引用的类型 . 也就是说,任何类型“引用Foo”的变量都会调用Foo.DoSomething(),任何“Bar的引用”都会调用Bar.DoSomething(),无论实际引用的对象是什么类型 .
test
指的是Bar
的新对象,因此调用test.DoSomething()
调用对象Bar
的DoSomething()
. 这返回true .new Bar()
表示创建一个新的Bar
对象并调用默认构造函数(在这种情况下不执行任何操作) .它返回
true
,因为test.DoSomething()
返回true
,因为它具有Foo
实现的覆盖(因此不会调用Foo
实现) .