1

我试图理解 C# 中的继承,这就是我尝试一些示例的原因,但我知道使用new关键字或没有 new 关键字的事情是相同的。

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

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

3 回答 3

13

在这种new情况下,关键字表示方法的阴影

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

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

请参阅C# 中的阴影和覆盖之间的区别?.

于 2012-04-06T13:07:32.323 回答
6

如果没有new关键字,则会出现编译器警告,因为编译器不确定您是否打算隐藏它。您应该指定newor override,以便编译器知道您没有犯错误。

这类似于“为什么private类成员有关键字,因为它们默认是私有的?” 和“为什么类有internal关键字,因为它们默认是内部的?”。常见的答案是,显式通常比隐式更好。

于 2012-04-06T13:10:06.410 回答
0

在继承中,您可以将基类中的方法标记为虚拟方法,这使派生类有机会覆盖它,从而为派生类提供不同的实现。

但是如果基类没有将方法标记为虚拟方法,那么派生类就不能覆盖基类方法。如果派生类实现了与基类同名的方法,它将作为独立于基类的方法实现。此时编译器会发出警告,指出派生方法“隐藏”了从基类继承的成员。如果使用 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” - 两次。

于 2019-04-30T21:18:55.943 回答