new关键字有三种用法,也有归为两种:
(1)new 运算符 用于创建对象和调用构造函数。
(2)new 修饰符 用于隐藏基类成员的继承成员。
(3)new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用 new 修饰符修饰该成员。例如:
Another Example:
输出:
100
55
22
invoke in MyBaseC
invoke in MyBaseC
invoke in MyDerivedC
一道笔试题:
请问o.MethodA()调用的是:
A.BaseClass.MethodA
B.Class2.MethodA
C.Class1.MethodA
D.都不是
答:A
(1)new 运算符 用于创建对象和调用构造函数。
(2)new 修饰符 用于隐藏基类成员的继承成员。
(3)new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用 new 修饰符修饰该成员。例如:
public class BaseC
{
public int x;
public void Invoke() {}
}
public class DerivedC : BaseC
{
new public void Invoke() {}
}
Another Example:
using System;
public class MyBaseC
{
public static int x = 55;
public static int y = 22;
public virtual void invoke()
{
Console.WriteLine("invoke in MyBaseC");
}
}
public class MyDerivedC : MyBaseC
{
new public static int x = 100;
/*new*/ public /*override*/ void invoke()
{
Console.WriteLine("invoke in MyDerivedC");
}
public static void Main()
{
Console.WriteLine(x);
Console.WriteLine(MyBaseC.x);
Console.WriteLine(y);
MyBaseC o1 = new MyBaseC();
o1.invoke();
MyBaseC o2 = new MyDerivedC();
o2.invoke();
MyDerivedC o3 = new MyDerivedC();
o3.invoke();
Console.Read();
}
}
输出:
100
55
22
invoke in MyBaseC
invoke in MyBaseC
invoke in MyDerivedC
一道笔试题:
abstract class BaseClass
{
public virtual void MethodA()
{
}
public virtual void MethodB()
{
}
}
class Class1: BaseClass
{
public void MethodA(string arg)
{
}
public override void MethodB()
{
}
}
class Class2: Class1
{
new public void MethodB()
{
}
}
class MainClass
{
public static void Main(string[] args)
{
Class2 o = new Class2();
Console.WriteLine(o.MethodA());
}
}
请问o.MethodA()调用的是:
A.BaseClass.MethodA
B.Class2.MethodA
C.Class1.MethodA
D.都不是
答:A