示例:http: //msdn.microsoft.com/en-us/library/9fkccyh4.aspx
在这个例子中(是的,我知道这只是一个例子)所有派生类都覆盖了基类中的 Area 方法。当然,如果在每个派生类中我们调用方法 Area1 而不是 Area,那么就不需要重写了吗?
是否纯粹是为了确保每个派生类都可以访问 Area 方法?
示例:http: //msdn.microsoft.com/en-us/library/9fkccyh4.aspx
在这个例子中(是的,我知道这只是一个例子)所有派生类都覆盖了基类中的 Area 方法。当然,如果在每个派生类中我们调用方法 Area1 而不是 Area,那么就不需要重写了吗?
是否纯粹是为了确保每个派生类都可以访问 Area 方法?
这不是关于具有相同的名称,而是关于派生类能够覆盖基类功能,在需要时做一些更具体/不同的事情。派生类可以选择不覆盖该方法,在这种情况下,它将使用基类方法。
想象一个带有 OpenDoor 方法的 BaseCar 类。BaseCar OpenDoor 方法可以处理大多数用例,例如向外拉门以打开它,但是对于 SuperCar 的一个实例,您可以重写 OpenDoor 方法来处理它自己的方法,例如向上拉门以打开它。
使用这种方法,您可以确信对于 BaseCar 的任何实例,当您调用 OpenDoor 时,它将调用适当的代码。
你不能告诉我这个:
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
方法.. 允许您对列表中的每个项目调用相同的方法.. 但它被分派给每个单独的实现。