background image

虚方法:

1.

一个虚方法必须要用 virtual   

或 abstract 或 override 修饰

2.

虚方法不能省略访问控制符,不能是 private 和 static 的,因为他们应该可以被子类所覆盖,

3.

子类要覆盖父类中的方法,须用 override,否则认为是一个新方法,并隐藏了父类的方法,不会实行
虚方法的调用,

4.

覆盖与被覆盖的方法必须有相同的可访问性和相同的返回类型

虚方法和非虚方法的区别

For example:

Class A

  

class B:A

  

{

public void F(){…}

  

new public void F(){}

public virtual void G(){…}

  

public override void G(){}

}

  

}

Class Test

{

  public static void Main()

  {

B b = new B();  |

a.F();//调用 A.F

|

a.G();//调用 B.G

A a = b; 

|

b.F();//调用 B.F

|

b.G();//调用 B.G

}

}

注释: 虚方法调用的方法是运行时对象实例的方法,如:a.G 打印的是 B.G 的方法而非 A.G 的方法

 非虚方法调用的是便宜时对象类型(A a = b; 既认为是 a,而非 b),如 a.F 执行的是 A.F 方法

虚方法调用和非虚方法调用的混合使用:

由于可以在子类中用 override 来覆盖父类的方法,又可以使用 new 修饰符来隐藏继承的方法,所以在

多次继承的情况下,会产生比较复杂的现象,这时,调用哪个方法不由运行时和编译时类型对象来决定:

Class A

Class B : A

class C : B

{

{

{

  Public virtual void F(){…}   public override void F(){…}

  new public virtual void F(){…}

}

}

}

Class D : C 

{

  Public override void F(){…} 

}

Class Test

{

  D d = new D();   

|  B b = d;

|  

a.F();//调用 B.F

|

c.F();//调用 D.F

  A a = d;

|  C c = d;

|  

b.F();//调用 B.F

|

d.F();//调用 D.F

}

反射:

运行时根据程序集及其中的类型得到相关的信息称为反射(Reflection),动态类型创建指运行时动态

创建对象.
常用的类有:

 System.Type

System.Assembly

 System.Activator;

常用的命名空间: System.RunTme

System.Reflection