//多态性
编译时的多态性是通过重载(overload)来实现
运行时的多态性是通覆写(override)虚成员实现
@虚拟方法和覆写(override)--实现运行时的多态性
虚拟方法是指在即类中声明为virtual,又在一个或多个派生类中重新定义的方法。当派生类重新定义虚拟方法是,就要使用override关键字。虚拟方法不能被定义为static或abstract。方法重载形成了C#的一个重要概念:动态方法分配(dynamic mothod dispatch)。动态方法分配是一种在程序运行时,而不是在编译时调用重载函数的机制。动态方法分配概念非常重要,因为运行期多态是靠它实现的。
覆写(override)方法不是必须的,如果派生类没有提供覆写(override)虚拟方法,那么基类的方法就会被应用。例如:
编译时的多态性是通过重载(overload)来实现
运行时的多态性是通覆写(override)虚成员实现
@虚拟方法和覆写(override)--实现运行时的多态性
虚拟方法是指在即类中声明为virtual,又在一个或多个派生类中重新定义的方法。当派生类重新定义虚拟方法是,就要使用override关键字。虚拟方法不能被定义为static或abstract。方法重载形成了C#的一个重要概念:动态方法分配(dynamic mothod dispatch)。动态方法分配是一种在程序运行时,而不是在编译时调用重载函数的机制。动态方法分配概念非常重要,因为运行期多态是靠它实现的。
覆写(override)方法不是必须的,如果派生类没有提供覆写(override)虚拟方法,那么基类的方法就会被应用。例如:
1
using
System;
2 class Base
3 {
4 public virtual void who()
5 {
6 Console.WriteLine( " who() in Base " );
7 }
8 }
9 class Derived1:Base
10 {
11 public override void who()
12 {
13 Console.WriteLine( " who() in Derived1 " );
14 }
15 }
16 class Derived2:Base
17 { // 不覆写who()方法
18 }
19
20 class NoOverrideDemo
21 {
22 public static void Main()
23 {
24 Base baseOb = new Base();
25 Derived1 dOb1 = new Derived1();
26 Derived2 dOb2 = new Derived2();
27
28 Base baseRef; // 一个基类引用
29
30 baseRef = baseOb;
31 baseRef.who();
32
33 baseRef = dOb1;
34 baseRef.who();
35
36 baseRef = dOb2;
37 baseRef.who(); // 调用基类的方法who()
38 }
39 }
2 class Base
3 {
4 public virtual void who()
5 {
6 Console.WriteLine( " who() in Base " );
7 }
8 }
9 class Derived1:Base
10 {
11 public override void who()
12 {
13 Console.WriteLine( " who() in Derived1 " );
14 }
15 }
16 class Derived2:Base
17 { // 不覆写who()方法
18 }
19
20 class NoOverrideDemo
21 {
22 public static void Main()
23 {
24 Base baseOb = new Base();
25 Derived1 dOb1 = new Derived1();
26 Derived2 dOb2 = new Derived2();
27
28 Base baseRef; // 一个基类引用
29
30 baseRef = baseOb;
31 baseRef.who();
32
33 baseRef = dOb1;
34 baseRef.who();
35
36 baseRef = dOb2;
37 baseRef.who(); // 调用基类的方法who()
38 }
39 }
//
程序输出如下:
who() in Base
who() in Derived1
who() in Base
who() in Base
who() in Derived1
who() in Base
//重载overload
方法名必须相同
参数列表必须不同
返回值类型可以不同
//覆写override
只有虚方法和抽象方法才能被覆写
相同的方法名
相同的参数列表
相同的返回值类型
//抽象(abstract)方法
必须被派生类覆写的方法。
可以看成是没有实现体的虚方法。
如果类中包含抽象方法,那么累就必须定义为抽象类,不论是否还包含其它一般方法。
abstract关键字只能用于通常的方法,不能用于静态的方法。
一起使用virtual和abstract是错误的。