C#中的new修饰符

(1)new 运算符 用于创建对象和调用构造函数
(2)new 修饰符 用于隐藏基类成员的继承成员。
(3)new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。

MSDN:在用作声明修饰符时,new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。 虽然可以不使用 new 修饰符来隐藏成员,但将收到编译器警告。 如果使用 new 来显式隐藏成员,将禁止此警告。

复制代码
 1 public class BaseClass
 2    {
 3        public void DisplayName()
 4        {
 5            Console.WriteLine("BaseClass");
 6        }
 7    }
 8  
 9 public class DerivedClass : BaseClass
10    {
11        public virtual void DisplayName()
12        {
13            Console.WriteLine("DerviedClass");
14        }
15    }
16 
17  public class SubDerviedClass : DerivedClass
18    {
19        public override void DisplayName()
20        {
21            Console.WriteLine("SubDerviedClass");
22        }
23    }
24  
25    public class SuperDerviedClass : SubDerviedClass
26    {
27        public new void DisplayName()
28        {
29            Console.WriteLine("SuperDerviedClass");
30        }
31    }
复制代码

个人理解:

C#和C++是一样的,类中的方法默认是sealed的,派生类是无法重写基类的同名函数的。

SuperDerviedClass sdc = new SuperDerviedClass();

依次将对象赋值给其他的类。分表调用DisplayName方法。

SuperDerviedClass.DisplayName()输出SuperDerviedClass,因为该类没有派生,方法无法被重载。

SuperDerviedClass.DisplayName()输出SubDerviedClass,该类的派生类的同名方法用new修饰,被隐藏。

DerivedClass.DisplayName()输出SubDerviedClass,该类的最远派生类重写了改方法。,而再远的类使用new修饰符,方法被隐藏。

Java的类中的方法默认是virtual的,任何派生类都可以重写父类的方法。

C#语言还是比较常见的东西,这里我们主要介绍C# new修饰符,包括介绍C# new修饰符与 new 操作符是两个概念等方面。

C# new修饰符是起什么作用?

◆C# new修饰符与 new 操作符是两个概念;

◆C# new修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型;

◆C# new修饰符只能用于继承类,一般用于弥补基类设计的不足;

◆C# new修饰符和 override 修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥。

示例:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. namespace Example09  
  5. {  
  6. class BaseClass  
  7. {  
  8. //基类设计者声明了一个PI的公共变量,方便进行运算  
  9. public static double PI = 3.1415;  
  10. }  
  11. class DervieClass : BaseClass  
  12. {  
  13. //继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显式隐藏基类中的声明  
  14. public new static double PI = 3.1415926;  
  15. }  
  16. class Program  
  17. {  
  18. static void Main(string[] args)  
  19. {  
  20. Console.WriteLine(BaseClass.PI);  
  21. Console.WriteLine(DervieClass.PI);  
  22.    
  23. Console.ReadLine();  
  24. }  
  25. }  

定义类

修饰符

注释

internal

默认修饰符,当前项目内部访问

public

可以有其它项目访问

abstract

抽象类,不能实例化,只能继承

sealed

密封类,只能实例化,不能继承

定义成员

在类的修饰符的约束下,成员的修饰符有如下特性。

修饰符

注释

public

可以由任何代码访问

private

默认修饰符,成员只能由类中的代码访问

internal

只能由定义它的程序集(项目)内部的代码访问

protected

只能由类或派生类中的代码访问

定义字段

字段用标准的变量声明格式和前面介绍的修饰符来定义。

修饰符

注释

readonly

只能在执行构造函数的过程中,或由初始化赋值语句赋值

static

必须通过定义它们的类来访问

const

同static,必须通过定义它们的类来访问

new

用于继承类中,显式地表明隐藏基类中的同名字段

定义方法

修饰符

注释

static

必须通过定义它们的类来访问

virtual

方法可以重写

abstract

方法必须在非抽象的派生类中重写,只用于抽象类中

override

方法编写了一个基类方法(如果方法被重写,就必须使用该关键字)

extern

方法定义放在其他地方

new

用于继承类中,显式地表明隐藏基类中的同名方法

定义嵌套类

在类的修饰符的约束下,成员的修饰符有如下特性。

修饰符

注释

new

显式地表明隐藏基类中的同名类

原文地址:https://www.cnblogs.com/zhangxiaolei521/p/6398452.html