使用 new 关键字在 C# 中的继承

本文关键字:继承 new 关键字 使用 | 更新日期: 2023-09-27 18:30:27

我正在尝试理解 C# 中的继承,这就是我尝试一些示例的原因,但我知道使用新关键字或不使用关键字都是相同的。

那为什么我们需要新的关键词呢?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            List<int> col = new List<int>();
            Class1 c1 = new Class1();
            Class2 c11 = new Class2();
            Class1 c111 = new Class3();
            c1.setmessage();
            c11.setmessage();
            c111.setmessage();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
   
}
class Class1
{
    private string member;
    public  void setmessage()
    {
        MessageBox.Show("Class1");
    }
}
class Class2 : Class1
{
    private string member;
    public  void setmessage()
    {
        MessageBox.Show("Class2");
    }
}

使用 new 关键字在 C# 中的继承

在此

上下文中,new关键字表示方法的阴影

这意味着就继承而言,您不是在重写基类中的方法,而是编写一个完全独立的方法。

如果编译器未用于未被重写的可重写方法,则会发出警告,因为大多数情况下这是一个错误,应仅重写该方法。在那里有new关键字表明阴影是一个明确的决定。

请参阅 C# 中的阴影和重写之间的区别?。

如果没有 new 关键字,就会有一个编译器警告,因为编译器不确定您是否要隐藏它。您应该指定newoverride,以便编译器知道您没有犯错。

这类似于"为什么类成员有一个private关键字,因为它们默认是私有的?"和"为什么类有一个internal关键字,因为它们默认是内部的?"。常见的答案是,通常明确比隐含更好。

在继承中,可以将基类中的方法标记为 virtual,这为派生类提供了重写它的机会,从而为派生类提供不同的实现。

但是,如果基类未将方法标记为虚拟,则派生类无法重写基方法。如果派生类实现与基类同名的方法,它将作为基类的独立方法实现。此时,编译器会发出警告,指出派生方法"隐藏"基类中的继承成员。如果使用 new 关键字,则该编译器将消失。

举个例子:

class Base
{
     public void DoWork()
     {
         Console.WriteLine("Base.DoesWork");
     }
}
class Derived : Base
{
    public void DoWork()  
    // warning Derived.DoWork() hides inherited member Base.DoWork(). 
    // Use the new keyword if hiding was intended
    {
        Console.WriteLine("Derived.DoesWork");
    }
}

如果使用public new void DoWork()编译器警告将消失。

有趣的是,如果您执行:

Base b = new Base();
b.Execute();
b = new Derived();
b.Execute();

输出将是"Base.DoesWork" - 两次。