0

示例:http: //msdn.microsoft.com/en-us/library/9fkccyh4.aspx

在这个例子中(是的,我知道这只是一个例子)所有派生类都覆盖了基类中的 Area 方法。当然,如果在每个派生类中我们调用方法 Area1 而不是 Area,那么就不需要重写了吗?

是否纯粹是为了确保每个派生类都可以访问 Area 方法?

4

2 回答 2

1

这不是关于具有相同的名称,而是关于派生类能够覆盖基类功能,在需要时做一些更具体/不同的事情。派生类可以选择不覆盖该方法,在这种情况下,它将使用基类方法。

想象一个带有 OpenDoor 方法的 BaseCar 类。BaseCar OpenDoor 方法可以处理大多数用例,例如向外拉门以打开它,但是对于 SuperCar 的一个实例,您可以重写 OpenDoor 方法来处理它自己的方法,例如向上拉门以打开它。

使用这种方法,您可以确信对于 BaseCar 的任何实例,当您调用 OpenDoor 时,它将调用适当的代码。

于 2013-09-25T11:39:59.300 回答
1

你不能告诉我这个:

shape.Area1

比:

shape.Area

任何虚拟都存在,因为它允许您更改派生类中的功能。让我们更进一步地了解 MSDN 文章。

假设您有一个列表Shape

var list = new List<Shape>() { new Circle(), new Square(), new Triangle() };

Shape有一个名为GetName().

public virtual string GetName() {
    return "Shape";
}

现在假设我们正在创建一个绘图应用程序,它必须在渲染循环中渲染这些形状的名称。鉴于您在上面的评论,这就是我假设您将实现它的方式:

while (true) {
    foreach (Shape s in list) {
        if (s is Circle) {
            render(((Circle)s).GetName1()); // Circle's "GetName1" method you've defined.
        }
        else if (s is Square) {
            render(((Square)s).GetName1()); // Square's "GetName1" method you've defined.
        }
        else if (...) // and so on..
    }
}

你为什么要这样做..当你可以这样做时:

public class Square : Shape {
    public override string GetName() { // Note, same name
        return "Square";
    }
}

// ... other classes overriding the method here ...

while (true) {
    foreach (Shape s in list) {
        render(s.GetName());
    }
}

每个派生类都实现自己的GetName方法.. 允许您对列表中的每个项目调用相同的方法.. 但它被分派给每个单独的实现。

于 2013-09-25T11:41:11.047 回答