我正在尝试理解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");
}
}
答案 0 :(得分:13)
此上下文中的new
关键字表示方法的阴影。
这意味着您不从基类覆盖该方法,但就继承而言,编写一个完全单独的方法。
如果编译器未用于未被覆盖的可覆盖方法,则会发出警告,因为大多数情况下这是一个错误,并且应该简单地覆盖该方法。拥有new
关键字表明阴影是一个明确的决定。
答案 1 :(得分:5)
如果没有new
关键字,则会出现编译器警告,因为编译器不确定您是否要隐藏它。您应该指定new
或override
,以便编译器知道您没有犯错误。
这类似于“为什么类成员有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”-两次。