使用new重写基类成员
继承类不能删除基类中的成员,但可以使用new关键字来隐藏基类的该成员;new关键字可以显式隐藏从基类继承的成员;若不使用new关键字直接声明同名成员则会出现警告,例:
class BaseClass { protected int age = 23; } class InheritClass : BaseClass { protected int age = 22; } |

使用new的同时也可以修改基类成员的访问修改类型,完整示例如下:
.png)
使用new实质是对基类成员的重写,对IL底层机制来说,new修饰符不会影响代码的编译,它唯一的作用只是移除编译器的警告。
new与override区别
两者都可以实现对基类的重写,从形式上讲区别是:
1、override需要基类中声明为virtual类型;
2、override重写方法不可更改方法访问类型;
另外值得引起注意的是new重写方法是在脱离基类在继承而中产生新的方法,基类方法与继承方法之间无任何联系,即继承类从基类中复制了基类方法的副本,两个方法之间不存在引用关系;override实质是对基类方法的重写。
class VirtualClass { public string name = "Wang Hongjian"; public virtual void DisplayName() { Console.WriteLine("My name is {0}", name); } } /*new重写*/ class NewVirtualClass : VirtualClass { new public void DisplayName() { Console.WriteLine("New Method:My name is {0}", base.name); } } /*override重写*/ class InheritVirtualClass : VirtualClass { public override void DisplayName() { Console.WriteLine("Override Method:My name is {0}", base.name); } } class Program { static void Main(string[] args) { /*new重写*/ BaseClass baseClass = new BaseClass(); baseClass.DisplayMyAge(); InheritClass _class = new InheritClass(); _class.DisplayMyAge(); Console.WriteLine(); /*new重写与virtual重写*/ VirtualClass virtualClass=new VirtualClass(); virtualClass.DisplayName(); VirtualClass newVirtualClass = new NewVirtualClass(); virtualClass.DisplayName();//注意此处结果 InheritVirtualClass _virtualClass = new InheritVirtualClass(); _virtualClass.DisplayName(); } } |
运行结果

注意使用new重写并没有更改基类的方法。
Related posts:
以上关联文章由 Yet Another Related Posts Plugin 提供支持。
Leave a reply