给定以下类:
interface IShape
{
void Draw();
}
class Rectangle : IShape
{
public void Draw() { }
}
class Square : Rectangle
{
public new void Draw() { }
}
谁能解释一下第二个 Draw 方法中发生了什么?
Rectangle rect = new Rectangle();
rect.Draw();
rect = new Square();
rect.Draw();
手边,我会说将调用 Square 类的 Draw 方法,但是当我将其输入 VS2013 时,会调用 Rectangle 类的 Draw 方法。
最佳答案
在Square
类,new
关键字告诉编译器这是一个全新的方法,恰好与继承的方法具有相同的签名。因为是巧合,所以不应该覆盖继承的方法。
在这种情况下,调用 Draw()
时通过 Square
变量,编译器将选择新方法。如果在这种情况下它没有选择新方法,如果您考虑的话,您根本无法调用它。如果你想调用老Draw()
, 你仍然可以通过 Rectangle
调用它变量(即使在同一个实例上)。
这叫做hiding 你可以用任何方法来做。您不会经常需要它 - 如果可能,您应该避免使用它,因为虽然它的语义定义明确,但它会使您的源代码有点困惑。
相反,如果您希望表示这不是巧合并且您有意覆盖具有相同签名的继承方法,您应该使用关键字override
。 关于你的新方法。在这种情况下,调用 Draw()
时在一个对象上,你总是会得到 Draw()
用于创建该对象的类的版本( new Square()
、 new Rectangle()
等),无论您从哪个变量调用它。
请记住,被覆盖的方法必须首先允许自身被覆盖。为此,必须将其标记为 virtual
首先 - 未标记为 virtual
的方法不能被覆盖。
这叫做overriding ,正如关键字所说。你会经常看到和使用这个,因为它启用polymorphism ,这是面向对象编程的核心概念之一。
关于c# - 简单的 C# OOP 继承查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29376384/