认识new修饰符

new关键字有三种用法,也有归为两种:
(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值