使用new重写基类成员

继承类不能删除基类中的成员,但可以使用new关键字来隐藏基类的该成员;new关键字可以显式隐藏从基类继承的成员;若不使用new关键字直接声明同名成员则会出现警告,例:

?View Code CSHARP
class BaseClass 
{
 protected int age = 23; 
}
class InheritClass : BaseClass 
{ 
 protected int age = 22; 
}

使用new的同时也可以修改基类成员的访问修改类型,完整示例如下:

使用new实质是对基类成员的重写,对IL底层机制来说,new修饰符不会影响代码的编译,它唯一的作用只是移除编译器的警告。

new与override区别

两者都可以实现对基类的重写,从形式上讲区别是:
1、override需要基类中声明为virtual类型;
2、override重写方法不可更改方法访问类型;
另外值得引起注意的是new重写方法是在脱离基类在继承而中产生新的方法,基类方法与继承方法之间无任何联系,即继承类从基类中复制了基类方法的副本,两个方法之间不存在引用关系;override实质是对基类方法的重写。

?View Code CSHARP
    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:

  1. C#难点逐个击破(1):ref参数传递 c#...
  2. C#难点逐个击破(5):类的访问类型 类的访问类型有时也叫访问级别,使用以下访问修改符:Public、Protected、Private、internal、protected internal。讲这四类之间的区别时有必要讲解一个概念:程序集。程序集(Assembly),可以简单理解为编译之后生成的.dll或.exe文件,相对于namespace是类库的逻辑组织形式,它可以称为程序类库的物理组织形式,msdn上描述“程序集包含描述它们自己的内部版本号和它们包含的所有数据和对象类型的详细信息的元数据”。一般情况是一个程序集可以包含一个或者多个命名空间。 Public:对其他任何类的任何方法都是可见的; Private:本类中定义的成员只有本类的方法才能访问; Protected:本类中的成员只有本类的方法及继承本类的类的方法才能访问; internal:本类中的成员只有本类所在的程序集中的任何类的方法访问; protected internal:为protected与internal的并集。 因此从访问级别由高到低应当是Public>protected internal>internal>Protected>Private...
  3. C#难点逐个击破(11):分部类(partial class) 分部类 分部类是一个类的多个部分,可以认为是其子集,所有分部类可以合并成一个完整的类; 可以在一个文件或多个文件中定义分部类 值得注意的是,修饰符partial并不是C#关键字,因此在上下文中可以使用partial作为标识符,但如果是在关键字class、struct或interface中,它就代表分部类。 file1.cs       partial class MyPartClass...
  4. C#难点逐个击破(10):is与as is C#中允许数据在继承链中向下转型,在转换前需要判断数据的类型,可以使用is来判断基础类型。可以这样来理解:若该对象可以非空,且可以强制转换为所提供的类型而不引发异常,则is表达式返回true。使用语法为: if(obj is objType) { } 若obj为null则返回false; /// <summary>...
  5. C#难点逐个击破(2):out返回参数 之前提到ref是将原方法中的参数影响的结果返回到调用它的方法中,out与ref类似,相比之下,ref传递参数的地址,out是返回值。传值(by value)与传址(by reference)分别为普通传递参数方式与ref声明方式,传址方式在使用前需要ref关键词修饰;out为输出返回传递,与ref相同之处较多,其重要区别是在上一节讲到的ref在被引用方法中必须被初始化;out在被引用方法中一定要有返回值。 using System; /******************************  * Chapter:C#难点逐个击破(一)  * Author:王洪剑...

以上关联文章由 Yet Another Related Posts Plugin 提供支持。