虚方法:
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