C#类的多态性详解

2019-12-26 13:37:03于海丽

易采站长站为您分析C#类的多态性,主要有两种:一是编译时的多态性,二是运行时的多态性,需要的朋友可以参考下

第一种:编译时的多态性,

直接这样说不知道说啥?程序执行过程主要分为三步:编译,链接,运行。在编译时体现的多态性是通过方法的重载来实现的。方法的重载我们听过,就是一个类对象调用若干同名,但参数类型、个数不同。类对象是根据参数类型,个数来决定调用哪个同名方法,实现何种操作。C#语言的方法重载与C++、java基本是一样的,但是C#还包含C++的运算符重载,java里面没有这个概念。

第二种:运行时的多态性,

是在系统运行时,调用一个名字相同,参数类型也相同以及个数也完全一样的方法,但会完成不同的操作。C#运行时的多态性通过虚方法实现。在类方法声明加上了virtual修饰符,称为虚方法,反之为非虚方法。就这一点C#跟C++有很多相似之处。

代码清单:虚方法与非虚方法的区别

 

 
  1. namespace e_11   {  
  2. class A   {  
  3. public void F() //非虚方法   { Console.WriteLine("A.F"); }  
  4. public virtual void G() //虚方法   { Console.WriteLine("A.G"); }  
  5.   }  
  6. class B : A //A类为B类的基类   {  
  7. new public void F() //隐藏基类的同名非虚方法F(),注意使用new   { Console.WriteLine("B.F"); }  
  8. public override void G() //隐藏基类的同名虚方法G(),注意使用override   { Console.WriteLine("B.G"); }  
  9. }   class Test  
  10. {   static void F2(A aA) //注意,参数为A类引用变量  
  11. { aA.G(); }   static void Main(string[] args)  
  12. {   B b = new B();  
  13. A a1 = new A();   A a2 = b; //允许基类引用变量引用派生类对象,a2引用A类的派生类B的对象b  
  14. a1.F(); //调用基类A的非虚方法F(),显示A.F   a2.F(); //F()为非虚方法,调用基类A的F(),显示A.F  
  15. b.F(); //F()为非虚方法,调用派生类的F(),显示B.F   a1.G(); //G()为虚方法,因a1引用基类A对象,调用基类A的G(),显示A.G