继承和覆盖时对象声明中的 C# new
C# new in object declaration when inherit and override
例如,
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
对象并调用默认构造函数(在这种情况下不执行任何操作)。
它 returns true
因为 test.DoSomething()
returns true
,因为它有 Foo
实现的覆盖(所以 Foo
实现不会被调用)。
Foo test = new Bar();
test
指的是 Bar
的新对象,因此调用 test.DoSomething()
调用对象 Bar
的 DoSomething()
。这个returns是真的。
new Bar()
实际上创建了一个 Bar 类型的新对象。
virtual
/override
和 new
之间的区别(在方法覆盖的上下文中)是您是否希望编译器考虑 [=24= 的类型]reference 或 object 的类型决定执行哪个方法。
在这种情况下,您有一个名为 test
的 "reference to Foo" 类型的引用,并且此变量引用了一个 Bar 类型的对象。因为 DoSomething()
是虚拟的并且被覆盖了,这意味着它将调用 Bar 的实现而不是 Foo 的实现。
除非你使用virtual/override,否则C#只考虑引用的类型。也就是说,任何 "reference to Foo" 类型的变量都会调用 Foo.DoSomething() 而任何 "reference to Bar" 都会调用 Bar.DoSomething() 而不管实际引用的对象是什么类型。
例如,
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
对象并调用默认构造函数(在这种情况下不执行任何操作)。
它 returns true
因为 test.DoSomething()
returns true
,因为它有 Foo
实现的覆盖(所以 Foo
实现不会被调用)。
Foo test = new Bar();
test
指的是 Bar
的新对象,因此调用 test.DoSomething()
调用对象 Bar
的 DoSomething()
。这个returns是真的。
new Bar()
实际上创建了一个 Bar 类型的新对象。
virtual
/override
和 new
之间的区别(在方法覆盖的上下文中)是您是否希望编译器考虑 [=24= 的类型]reference 或 object 的类型决定执行哪个方法。
在这种情况下,您有一个名为 test
的 "reference to Foo" 类型的引用,并且此变量引用了一个 Bar 类型的对象。因为 DoSomething()
是虚拟的并且被覆盖了,这意味着它将调用 Bar 的实现而不是 Foo 的实现。
除非你使用virtual/override,否则C#只考虑引用的类型。也就是说,任何 "reference to Foo" 类型的变量都会调用 Foo.DoSomething() 而任何 "reference to Bar" 都会调用 Bar.DoSomething() 而不管实际引用的对象是什么类型。