使用 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
关键字表示方法的阴影。
这意味着就继承而言,您不是在重写基类中的方法,而是编写一个完全独立的方法。
如果编译器未用于未被重写的可重写方法,则会发出警告,因为大多数情况下这是一个错误,应仅重写该方法。在那里有new
关键字表明阴影是一个明确的决定。
请参阅 C# 中的阴影和重写之间的区别?。
如果没有 new
关键字,就会有一个编译器警告,因为编译器不确定您是否要隐藏它。您应该指定new
或override
,以便编译器知道您没有犯错。
这类似于"为什么类成员有一个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" - 两次。