我是C#的新手(来自C ++)
我可以将方法声明为virtual
和override
吗?(在C ++中,该方法也可以是基类和派生类的虚拟方法)
我教科书中关于new
方法关键字的说明是:
有时您可能希望创建自己的基类中存在的方法实现。 Line类通过声明它来完成此操作 拥有print()方法。 Line print()方法隐藏了DrawingObject print()方法。效果是父print()方法不会 叫,除非我们做一些特别的事情以确保它被调用。 注意Line类print()方法中的new修饰符。这使得 这个方法隐藏了DrawingObject类的print()方法和 明确说明你不想要多态的意图 发生。如果没有new修饰符,编译器将产生警告 引起你的注意。
如果有什么影响?
问题请参考以下代码。
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
答案 0 :(得分:2)
virtual
,那么它将继续
保留virtual
在派生类中,直到它不被标记
为sealed
。 new
关键字,因为它会破坏多态性(请参阅使用Draw方法的示例 - 它应标记为虚拟)。多态性破坏的例子:
public class Base
{
public void Method()
{
Console.WriteLine("Base.Method()");
}
}
public class Derived : Base
{
public new void Method()
{
Console.WriteLine("Derived.Method()");
}
}
Derived obj = new Derived();
obj.Method(); // Will output "Derived.Method()"
((Base)obj).Method() // Will output "Base.Method()"
当您使用类层次结构时,通常不会发现这种情况。无论是从基类还是从派生类调用Method(),都不应该有所区别。
答案 1 :(得分:1)
您不能将virtual修饰符与static,abstract,private或override修饰符一起使用。
您可以从Knowing When to Use Override and New Keywords (C# Programming Guide)
回答大多数其他问题答案 2 :(得分:0)
是的,您可以使用virtual
关键字标记方法,然后使用override
在派生类中覆盖它。
new
明确表达您的意图,并确保它不是错误。答案 3 :(得分:0)
派生类中的new
关键字称为“遮蔽”基类的方法,实质上它隐藏了基类的方法实现。如果省略new
关键字,则会看到警告消息,编译器会告诉您应该使用new
语法明确声明要隐藏/隐藏方法。在语法中使用new
关键字使得阅读代码的任何人都明白您隐藏了基本实现。
注意:这只是一个警告,因为通过在派生类中实现非虚方法,您隐藏/隐藏了基类的实现。编译器只是告诉你要成为一个好公民,并告知正在阅读你的代码的其他人。