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

时间:2012-04-06 13:04:30

标签: c# inheritance new-operator

我正在尝试理解C#中的继承,这就是为什么我要尝试一些样本,但我知道使用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");
    }
}

3 个答案:

答案 0 :(得分:13)

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

这意味着您从基类覆盖该方法,但就继承而言,编写一个完全单独的方法。

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

请参阅Difference between shadowing and overriding in C#?

答案 1 :(得分:5)

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

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

答案 2 :(得分: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”-两次。