c# - 简单的 C# OOP 继承查询

标签 c# visual-studio oop inheritance

给定以下类:

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/

相关文章:

c++ - 有没有一种方法可以复制派生类指针的 vector 而不将其强制转换为基类?

javascript - Dojo 无参数构造函数调用带参数的基础构造函数

c# - 在 Mac 和 Linux 等其他平台上使用 C#.Net Windows 应用程序

c# - 如何正确实现IUserType?

c# - 当从 aspx.cs 页面传递值时,警报在 javascript 中显示未定义

c# - 应用程序设置可靠吗?

c# - 如何在错误密码计数锁定后解锁 ASPNETDB 用户帐户?

c# - 在后面的 UWP 代码中拆分网格

html - Visual Studio 2008 HTML 自动格式化程序

scala - 当我调用一个方法返回一个包含所述变量的案例类实例时,变量赋值会怎样?