C#简单的多态

    技术2026-10-04  2

    多态是面向对象编程的三大特性之一(封装,继承,多态)。

    多态就是同一个操作(通常是指方法,也可以是属性,事件甚至是字段),根据不同的对象能实现不同的效果。

    函数重载就是一个多态的表现。(面向过程的编程时是没有函数重载的)

    多态性又分为两种,一种是编译时的多态性,一种是运行时的多态性。

    编译时的多态性:编译时的多态性是通过重载来实现的。系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。

    运行时的多态性:运行时的多态性是通过覆写虚成员实现。系统运行时,才根据实际情况决定实现何种操作。重载和覆盖的关系要特别说明一下。

    重载和覆写的区别:

    重载 方法名必须相同 参数列表必须不相同 返回值类型可以不相同

    覆写 相同的方法名称 相同的参数列表 相同的返回值类型

    多态性往往要和继承同时使用才能体现出它的效果。举例说有一个动物类,有一个方法是叫。然后有猫类和狗类是继承于动物类。这样猫的叫和狗的叫应该是有不同的实现。

    那么定义一个动物类的引用指向猫类和指向狗类时调用的叫就应该有不同的效果。

    这里还会涉及到一个 覆写和隐藏的问题。先看代码。

    1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5:   6: namespace TestPolymorphism 7: { 8: public class testbase 9: { 10: public void doSomething(int number) 11: { 12: Console.WriteLine("{0} testbase.doSomething", number); 13: } 14:   15: public virtual void doWork() 16: { 17: Console.WriteLine("testbase.doWork"); 18: } 19: } 20:   21: public class testoverride : testbase 22: { 23: public new void doSomething(int number) 24: { 25: Console.WriteLine("{0} testoverride.doSomething",number); 26: } 27:   28: public override void doWork() 29: { 30: Console.WriteLine("testoverride.doWork"); 31: } 32: } 33: class Program 34: { 35: static void Main(string[] args) 36: { 37: testbase A = new testbase(); 38: testoverride B = new testoverride(); 39: A.doSomething(10); 40: A.doWork(); 41: B.doSomething(10); 42: B.doWork(); 43: A = B; 44: A.doSomething(10); 45: A.doWork(); 46:   47: Console.ReadKey(); 48: } 49: } 50: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

    输出

    重点在44和45行。最后两个调用其中doSomething()调用的是基类的方法,而doWork()调用的是子类的方法。

    想23行中使用new关键字(也可以不使用,但是会有一个警告)来隐藏父类的方法。只是隐藏,子类的引用就调用子类的重载的方法,父类的引用调用父类被隐藏的方法。

    doWork()中是使用 virtual 和 override 定义虚方法并且覆写父类的方法,就算是父类的引用调用的也是子类覆写的方法。因为原来的方法已经不见了,被覆写掉了。

    代码似乎比文字来的好理解很多。我文字的表达还是很糟。

     

    最后是几篇不错的文章

    http://www.cnblogs.com/Bear-Study-Hard/archive/2006/09/06/496366.html

    http://msdn.microsoft.com/zh-cn/library/ms173152(v=VS.90).aspx?appId=Dev10IDEF1&l=ZH-CN&k=k(CONST_CSHARPKEYWORD);k(CONST);k(SOLUTIONITEMSPROJECT);k(TargetFrameworkMoniker-

    http://msdn.microsoft.com/zh-cn/library/ms173152(v=VS.80).aspx

    最新回复(0)