📅  最后修改于: 2023-12-03 15:13:49.382000             🧑  作者: Mango
在 C# 中,new
关键字有两种使用方式:
使用 new
关键字,可以在类中定义新的实例或静态成员。它可以用在字段、属性、方法等成员声明中。
class MyClass
{
public int MyField = 1;
public void MyMethod()
{
Console.WriteLine("MyMethod in MyClass");
}
}
class MyDerivedClass : MyClass
{
public new int MyField = 2;
public new void MyMethod()
{
Console.WriteLine("MyMethod in MyDerivedClass");
}
}
class Program
{
static void Main(string[] args)
{
MyDerivedClass obj = new MyDerivedClass();
Console.WriteLine(obj.MyField); // 输出 2
obj.MyMethod(); // 输出 "MyMethod in MyDerivedClass"
((MyClass)obj).MyMethod(); // 输出 "MyMethod in MyClass"
}
}
上面的例子中,MyDerivedClass
继承自 MyClass
。在 MyDerivedClass
中,重载了 MyField
和 MyMethod
。
MyField
的类型是 new int
,它会隐藏来自基类的字段 MyField
。MyMethod
的类型是 new void
,它会隐藏来自基类的方法 MyMethod
。在 Main 方法中创建了 MyDerivedClass
的实例,并通过对象引用调用了 MyField
和 MyMethod
。由于 MyField
和 MyMethod
都是被隐藏了,在 MyDerivedClass
中定义的 MyField
和 MyMethod
将会被调用。
使用 new
关键字,可以在子类中隐藏父类中的成员。它允许在子类中声明与父类中同名的方法、属性或字段,从而隐藏来自父类的成员。
class MyClass
{
public void MyMethod()
{
Console.WriteLine("MyMethod in MyClass");
}
}
class MyDerivedClass : MyClass
{
public new void MyMethod()
{
Console.WriteLine("MyMethod in MyDerivedClass");
}
}
class Program
{
static void Main(string[] args)
{
MyDerivedClass obj = new MyDerivedClass();
obj.MyMethod(); // 输出 "MyMethod in MyDerivedClass"
((MyClass)obj).MyMethod(); // 输出 "MyMethod in MyClass"
}
}
上面的例子中,MyDerivedClass
继承自 MyClass
。在 MyDerivedClass
中,定义了一个与 MyClass
同名的方法 MyMethod
,它将隐藏父类中的方法。
在 Main 方法中创建了 MyDerivedClass
的实例,并通过对象引用调用了 MyMethod
。由于 MyMethod
在 MyDerivedClass
中被隐藏了,在 MyDerivedClass
中定义的 MyMethod
将会被调用。使用主动转换,还可以访问基类中的成员。