【发布时间】:2014-05-03 14:45:01
【问题描述】:
拥有以下覆盖(或不覆盖)Draw 方法的类
using System;
namespace ConsoleApplication1
{
public class Shape {
public virtual void Draw() {
Console.WriteLine("base Drawing a shape");
}
}
class Rectangle : Shape {
public new virtual void Draw() {
Console.WriteLine("new virt Drawing a rectangle");
base.Draw();
}
}
class Square : Rectangle {
public override void Draw() {
Console.WriteLine("new Drawing a square");
base.Draw();
}
}
class Triangle : Shape {
public override void Draw() {
Console.WriteLine("override Drawing a triangle");
base.Draw();
}
}
class SuperTriangle : Triangle {
public new void Draw() {
Console.WriteLine("new Drawing a SuperTriangle");
base.Draw();
}
}
class DefaultTriangle : Triangle {
public void Draw() {
Console.WriteLine("(-) Drawing a DefaultTriangle");
base.Draw();
}
}
class Program {
static void Main(string[] args) {
Console.WriteLine(@"
Rectangle : Shape (new virtual)
Square : Rectangle (override)
Triangle : Shape (override)
SuperTriangle : Triangle (new)
DefaultTriangle : Triangle (-)
");
System.Collections.Generic.List<Shape> shapes =
new System.Collections.Generic.List<Shape>() {
new Rectangle(), new Square(),
new Triangle(), new SuperTriangle(), new DefaultTriangle()};
foreach (Shape s in shapes) {
Console.WriteLine();
Console.WriteLine("(Shape) " + s.GetType().Name);
Console.WriteLine("________________________");
s.Draw();
Console.WriteLine();
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
我有以下输出:
Rectangle : Shape (new virtual)
Square : Rectangle (override)
Triangle : Shape (override)
SuperTriangle : Triangle (new)
DefaultTriangle : Triangle (-)
(Shape) Rectangle
________________________
base Drawing a shape
(Shape) Square
________________________
base Drawing a shape
(Shape) Triangle
________________________
override Drawing a triangle
base Drawing a shape
(Shape) SuperTriangle
________________________
override Drawing a triangle // <<<< !!!
base Drawing a shape
(Shape) DefaultTriangle
________________________
override Drawing a triangle // <<<< !!!
base Drawing a shape
这是否意味着new keyword 不是强制性的,而是隐式应用的,如果没有指定其他关键字?
PS。警告:
警告 1 'ConsoleApplication1.DefaultTriangle.Draw()' 隐藏继承 成员'ConsoleApplication1.Triangle.Draw()'。为了使当前 成员覆盖该实现,添加 override 关键字。 否则添加 new 关键字。
【问题讨论】:
-
是的,确实如此。很多细节here
-
@Andrei,谢谢,你能在答案中“解压”这条评论吗?! :)
-
好的,谢谢。它可能会帮助其他可以找到这个问题的人。完成。
-
@EricLippert,也许错过了窗口?
-
@Andrei:哎呀,你是对的。我的意思是说,你提到的问题的重复:stackoverflow.com/questions/3117838
标签: c# .net oop inheritance overriding