覆盖/新方法

本文关键字:新方法 覆盖 | 更新日期: 2024-10-18 08:10:42

我是C#(来自C++)的新手

  1. 我可以将一个方法声明为virtualoverride吗?(在C++中,方法可以是基类和派生类中的虚拟方法)

  2. 我教材中关于new方法关键字的解释是:

有时,您可能想要创建基类中存在的方法的自己的实现。Line类通过声明自己的print()方法。Line print()方法隐藏DrawingObjectprint()方法。结果是Parent print()方法将不会调用,除非我们做了一些特别的事情来确保它被调用。请注意Line类print()方法上的新修饰符。这使得该方法来隐藏DrawingObject类print()方法和明确表示您不希望多态性发生如果没有新的修饰符,编译器将产生警告以引起您的注意。

如果会产生什么影响?

  1. 基类方法是虚拟的,派生的是新的吗
  2. 基类方法不是虚拟的,派生的是新的
  3. 如果我不为派生类中的方法使用new关键字,会发生什么
  4. 如果方法在基类中不是虚拟的,多态性是如何发生的
  5. 为什么"没有新的修饰符,编译器将产生警告"

问题涉及以下代码。

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.");
    }
}

覆盖/新方法

  1. 如果实例成员在基类中声明为virtual,则它将继续在派生类中保留virtual,直到它不被标记为止作为CCD_ 6
  2. 避免使用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覆盖它。

  1. 如果您有派生类型的变量,将调用new方法。如果您有基类型的变量(但其中确实有派生类型),则将调用基类中的虚拟方法
  2. 同样
  3. 如果你用override标记它,你会得到经典的多态性
  4. 方法应该是虚拟it基类才能使用多态性
  5. 如果您偶尔无意中创建了一个隐藏基类版本的新方法,这对您来说是一个警告。你应该使用new来明确你的意图,并确保这不是一个错误

派生类中的new关键字被称为"遮蔽"基类的方法,本质上它隐藏了基类的方法实现。如果省略new关键字,您将看到的警告消息是编译器告诉您应该明确声明要使用new语法隐藏/隐藏该方法。语法中有new关键字,对于阅读代码的任何人来说,都会清楚地看到您隐藏了一个基本实现。


注意:这只是一个警告,因为在派生类中实现非虚拟方法会隐藏/隐藏基类的实现。编译器只是告诉你要做一个好公民,并通知正在阅读你代码的其他人。