看书中的例子没敲代码,始终不敢确定是什么。今天心痒,就测试了一把。
当然,不只是那个答案。也测试了其他的疑问。为了方便看答案加入了分割数据。
Code
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace ConsoleApplication2
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 Number num = new Number();
13 num.ShowNumber();
14 num.ShowInfo();
15 IntNnumber intnum = new IntNnumber();
16 Console.WriteLine("1111111111111111111111111111111");
17
18 intnum.ShowNumber();
19 Console.WriteLine("2222222222222222222222222222222222222222");
20 intnum.ShowInfo();
21 Console.WriteLine("3333333333333333333333333333333333");
22
23 Number number = new IntNnumber();
24 number.ShowInfo();
25 Console.WriteLine("44444444444444444444444444444444444444444");
26 number.ShowNumber();
27
28 Console.ReadLine();
29 }
30 }
31
32 class Number
33 {
34 public static int i = 123;
35 public virtual void ShowInfo()
36 {
37 Console.WriteLine("base class --");
38 }
39
40 public virtual void ShowNumber()
41 {
42 Console.WriteLine(i.ToString());
43 }
44
45 }
46
47
48 class IntNnumber:Number
49 {
50 new public static int i =456;
51 public new virtual void ShowInfo()
52 {
53 Console.WriteLine("derve class --");
54 }
55
56 public override void ShowNumber()
57 {
58 Console.WriteLine("bas"+Number.i.ToString());
59 Console.WriteLine("der"+i.ToString());
60 }
61
62 }
63
64
65
66 }
67
答案是:
123
base class --
1111111111111111111111111111111
bas123
der456
2222222222222222222222222222222222222222
derve class --
3333333333333333333333333333333333
base class --
44444444444444444444444444444444444444444
bas123
der456
第二种情况是IntNumber中的showInfo()方法不用new而是用override则答案是
123
base class --
1111111111111111111111111111111
bas123
der456
2222222222222222222222222222222222222222
derve class --
3333333333333333333333333333333333
derve class --
44444444444444444444444444444444444444444
bas123
der456
明白了,再看new在不同场合的定义
1,作为运算符,用于创建对象和调用构造函数。
2,作为修饰符,用于向基类成员隐藏继承成员。
作为修饰符,基本的规则可以总结为:实现派生类中隐藏方法,则基类方法必须定义为virtual,
将基类方法实现为vvirtual,能同时保证向前扩展和向后兼容,在派生类中通过new或override进行灵活控制。
new作为修饰符,实现隐藏基类成员时,不可和override共存,应为两者是互斥的:new用于实现创建新成员,同时隐藏基类的同名成员;
而override用于实现对基类成员的扩展。