覆盖/新方法
本文关键字:新方法 覆盖 | 更新日期: 2024-10-18 08:10:42
我是C#(来自C++)的新手
-
我可以将一个方法声明为
virtual
和override
吗?(在C++中,方法可以是基类和派生类中的虚拟方法) -
我教材中关于
new
方法关键字的解释是:
有时,您可能想要创建基类中存在的方法的自己的实现。Line类通过声明自己的print()方法。Line print()方法隐藏DrawingObjectprint()方法。结果是Parent print()方法将不会调用,除非我们做了一些特别的事情来确保它被调用。请注意Line类print()方法上的新修饰符。这使得该方法来隐藏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.");
}
}
- 如果实例成员在基类中声明为
virtual
,则它将继续在派生类中保留virtual
,直到它不被标记为止作为CCD_ 6 - 避免使用
new
关键字,因为它破坏了多态性(请参阅Draw方法的示例,它应该标记为virtual)
断裂多态性示例:
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(),都不应该有区别。
虚拟(C#参考)
不能将虚拟修饰符与静态、抽象、私有或重写修饰符一起使用。
您的大多数其他问题都可以从"知道何时使用覆盖和新关键字"(C#编程指南)
是的,您可以用virtual
关键字标记一个方法,然后在派生类中使用override
覆盖它。
- 如果您有派生类型的变量,将调用new方法。如果您有基类型的变量(但其中确实有派生类型),则将调用基类中的虚拟方法
- 同样
- 如果你用override标记它,你会得到经典的多态性
- 方法应该是虚拟it基类才能使用多态性
- 如果您偶尔无意中创建了一个隐藏基类版本的新方法,这对您来说是一个警告。你应该使用
new
来明确你的意图,并确保这不是一个错误
派生类中的new
关键字被称为"遮蔽"基类的方法,本质上它隐藏了基类的方法实现。如果省略new
关键字,您将看到的警告消息是编译器告诉您应该明确声明要使用new
语法隐藏/隐藏该方法。语法中有new
关键字,对于阅读代码的任何人来说,都会清楚地看到您隐藏了一个基本实现。
注意:这只是一个警告,因为在派生类中实现非虚拟方法会隐藏/隐藏基类的实现。编译器只是告诉你要做一个好公民,并通知正在阅读你代码的其他人。