答:
new 修饰符与 new 操作符是两个概念
new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型
new 修饰符只能用于继承类,一般用于弥补基类设计的不足
new 修饰符和 override 修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥
示例:
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Example09 6{ 7 class BaseClass 8 { 9 //基类设计者声明了一个PI的公共变量,方便进行运算10 public static double PI = 3.1415;11 }12 class DervieClass : BaseClass13 {14 //继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显式隐藏基类中的声明15 public new static double PI = 3.1415926;16 }17 class Program18 {19 static void Main(string[] args)20 {21 Console.WriteLine(BaseClass.PI);22 Console.WriteLine(DervieClass.PI);23 24 Console.ReadLine();25 }26 }27}
结果:3.14153.1415926
10.this 关键字的含义?
this 是一个保留字,仅限于构造函数和方法成员中使用
在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用
this 保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化
在 C# 系统中,this 实际上是一个常量,所以不能使用 this++ 这样的运算
this 保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Example10 6{ 7 class Class1 8 { 9 private double c;10 private string value;11 12 public double C13 {14 get15 {16 return c;17 }18 }19 public Class1(double c)20 {21 //限定同名的隐藏成员22 this.c = c;23 }24 public Class1(Class1 value)25 {26 //用对象本身实例化自己没有意义27 if (this != value)28 {29 c = value.C;30 }31 }32 public override string ToString()33 {34 //将对象本身做为参数35 return string.Format("{0} Celsius = {1} Fahrenheit", c, UnitTransClass.C2F(this));36 }37 38 //由于好奇,在这做了一个效率测试,想看看到底哪种方式访问成员变量更快,结论:区别不大。。。39 public string Test1()40 {41 long vTickCount = Environment.TickCount;42 for (int i = 0; i < 10000000; i++)43 this.value = i.ToString();44 return string.Format("Have this.: {0} MSEL", Environment.TickCount - vTickCount);45 }46 public string Test2()47 {48 long vTickCount = Environment.TickCount;49 for (int i = 0; i < 10000000; i++)50 value = i.ToString();51 return string.Format("Don't have this.: {0} MSEL", Environment.TickCount - vTickCount);52 }53 }54 class UnitTransClass55 {56 public static double C2F(Class1 value)57 {58 //摄氏到华氏的转换公式59 return 1.8 * value.C + 32;60 }61 }62 class Program63 {64 static void Main(string[] args)65 {66 Class1 tmpObj = new Class1(37.5);67 68 Console.WriteLine(tmpObj);69 70 Console.WriteLine(tmpObj.Test1());71 Console.WriteLine(tmpObj.Test2());72 73 Console.ReadLine();74 }75 }76}
结果:37.5 Celsius = 99.5 FahrenheitHave this.: 4375 MSELDon't have this.: 4406 MSEL
11.可以使用抽象函数重写基类中的虚函数吗?
可以
需使用 new 修饰符显式声明,表示隐藏了基类中该函数的实现
或增加 override 修饰符,表示抽象重写了基类中该函数的实现
示例:
1class BaseClass 2{ 3 public virtual void F() 4 { 5 Console.WriteLine("BaseClass.F"); 6 } 7} 8abstract class DeriveClass1 : BaseClass 9{10 public abstract new void F();11}1213//感谢watson hua(http://huazhihao.cnblogs.com/)的指点14//是他提醒了我还可以用这种方法抽象重写基类的虚方法15abstract class DeriveClass2 : BaseClass16{17 public abstract override void F();18}
当前平均分: 0.0(0 次打分)