是",;新";在C#.net中隐式使用的关键字?
具有以下类,该类重写(或不重写)Draw方法是",;新";在C#.net中隐式使用的关键字?,c#,.net,oop,inheritance,overriding,C#,.net,Oop,Inheritance,Overriding,具有以下类,该类重写(或不重写)Draw方法 using System; namespace ConsoleApplication1 { public class Shape { public virtual void Draw() { Console.WriteLine("base Drawing a shape"); } } class Rectangle : Shape { publ
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();
}
}
}
使用系统;
命名空间控制台应用程序1
{
公共阶级形态{
公共虚拟空间绘制(){
控制台。WriteLine(“绘制形状的基础”);
}
}
类矩形:形状{
公开新的虚拟抽空(){
WriteLine(“新的virt绘制矩形”);
base.Draw();
}
}
类正方形:矩形{
公共覆盖无效绘图(){
控制台。WriteLine(“新绘制正方形”);
base.Draw();
}
}
类三角形:形状{
公共覆盖无效绘图(){
Console.WriteLine(“覆盖绘制三角形”);
base.Draw();
}
}
类超三角形:三角形{
公开新提款(){
Console.WriteLine(“新绘制超三角形”);
base.Draw();
}
}
类DefaultTriangle:Triangle{
公众抽签(){
Console.WriteLine((-)绘制默认三角形);
base.Draw();
}
}
班级计划{
静态void Main(字符串[]参数){
Console.WriteLine(@)
矩形:形状(新虚拟)
正方形:矩形(替代)
三角形:形状(替代)
超级三角形:三角形(新)
默认三角形:三角形(-)
");
System.Collections.Generic.List形状=
新的System.Collections.Generic.List(){
新矩形(),新正方形(),
新建三角形(),新建超级三角形(),新建DefaultTriangle()};
foreach(形状中的形状s){
Console.WriteLine();
Console.WriteLine(“(Shape)”+s.GetType().Name);
Console.WriteLine(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”);
s、 Draw();
Console.WriteLine();
}
控制台。WriteLine(“按任意键退出”);
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
行为是默认行为。如果你想知道其背后的原因,或者想了解整个问题的更多细节,请参阅本文中的伟大答案。是的,确实如此。大量细节@Andrei,谢谢,你能在回答中“解开”这条评论吗?!:)当然,谢谢。这可能会帮助其他能够找到这个问题的人。完成了。@EricLippert,可能错过了窗户?@Andrei:哎呀,你说得对。我的意思是,重复你提到的问题:警告告诉我添加新的关键字。然而,我有疑问,这种修改是否会增加当前行为的变化(没有“new”关键字)……而且,对于我来说,还不是很清楚therm“隐藏一个实现”,而不仅仅是“new”关键字可以与“override”关键字一起使用……new
关键字隐藏底层实现,这意味着任何覆盖
都会覆盖新的虚拟
,而不是链上更高的虚拟
。就像是一个转折点。谢谢大卫和塞维。然而,问题是显式的new
是否等同于在函数名之前不指定任何关键字。