鍍金池/ 教程/ C#/ 多態(tài)性
循環(huán)
正則表達(dá)式
概述
委托
多態(tài)性
字符串
繼承
結(jié)構(gòu)體
集合
變量
不安全代碼
判斷
反射
異常處理
可空類型
方法
數(shù)據(jù)類型
命名空間
文件 I/O
類型轉(zhuǎn)換
屬性
程序結(jié)構(gòu)
事件
接口
預(yù)處理指令
運算符
多線程
匿名方法
索引器
泛型
封裝
常量和文字
基本語法
特性
數(shù)組
環(huán)境配置
運算符重載
枚舉

多態(tài)性

多態(tài)性(polymorphism) 這個詞意味著有多種形式。在面向?qū)ο蟮木幊谭妒街校鄳B(tài)性往往表現(xiàn)為“一個接口,多個函數(shù)”。

多態(tài)性可以是靜態(tài)的,也可以是動態(tài)的。在 靜態(tài)多態(tài)(static polymorphism)性 中,一個函數(shù)的響應(yīng)是在編譯時確定。動態(tài)多態(tài)性( dynamic polymorphism) 中,其函數(shù)響應(yīng)是在運行時決定。

靜態(tài)多態(tài)性

在編譯時將一個函數(shù)與一個對象連接起來的機制被稱為早期綁定機制。它也被稱為靜態(tài)綁定。C # 提供了兩種技術(shù)實現(xiàn)靜態(tài)多態(tài)性。他們是:

  • 函數(shù)重載
  • 運算符重載

我們將在下一章討論運算符重載。

函數(shù)重載

你可以在同一范圍對同一函數(shù)名有多重定義。該函數(shù)的定義必須用不同的類型或通過參數(shù)列表中的參數(shù)的數(shù)量進(jìn)行區(qū)分。不可以只用不同的返回類型區(qū)分不同的重載函數(shù)聲明。

下面的示例顯示使用函數(shù) print() 打印不同的數(shù)據(jù)類型:

using System;
namespace PolymorphismApplication
{
   class Printdata
   {
      void print(int i)
      {
         Console.WriteLine("Printing int: {0}", i );
      }

      void print(double f)
      {
         Console.WriteLine("Printing float: {0}" , f);
      }

      void print(string s)
      {
         Console.WriteLine("Printing string: {0}", s);
      }
      static void Main(string[] args)
      {
         Printdata p = new Printdata();

         // 調(diào)用 print 函數(shù)打印整型
         p.print(5);

         // 調(diào)用 print 函數(shù)打印浮點型
         p.print(500.263);

         // 調(diào)用 print 函數(shù)打印字符型
         p.print("Hello C++");
         Console.ReadKey();
      }
   }
}

編譯執(zhí)行上述代碼,得到如下結(jié)果:

Printing int: 5
Printing float: 500.263
Printing string: Hello C++

動態(tài)多態(tài)性

C# 允許你創(chuàng)建一個抽象類,被用于提供部分類的接口實現(xiàn)。執(zhí)行完成時,派生類繼承它。抽象類(Abstract classes) 包含抽象方法,這是由派生類來實現(xiàn)的。派生類具有更具體化,專業(yè)化的功能。

以下是關(guān)于抽象類的規(guī)則:

  • 你不能創(chuàng)建抽象類的實例
  • 你不能在抽象類的外部聲明抽象方法
  • 當(dāng)一個類聲明為 密封的(sealed) ,它不能被繼承,抽象類被不能聲明為密封的。

下面的程序演示了一個抽象類:

using System;
namespace PolymorphismApplication
{
   abstract class Shape
   {
      public abstract int area();
   }
   class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
      public override int area ()
      { 
         Console.WriteLine("Rectangle class area :");
         return (width * length); 
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("Area: {0}",a);
         Console.ReadKey();
      }
   }
}

編譯執(zhí)行上述代碼,得到如下結(jié)果:

Rectangle class area :
Area: 70

當(dāng)你在一個類中有定義函數(shù),并且希望它可以在一個被繼承的類中實現(xiàn)功能時,你可以使用虛函數(shù)(virtual functions) 。虛函數(shù)可以在不同的被繼承的類中實現(xiàn),并且將在程序運行時調(diào)用此類函數(shù)。

動態(tài)多樣性是通過抽象類虛函數(shù)實現(xiàn)的。

下列程序證實了上述說法:

using System;
namespace PolymorphismApplication
{
   class Shape 
   {
      protected int width, height;
      public Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      public virtual int area()
      {
         Console.WriteLine("Parent class area :");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {

      }
      public override int area ()
      {
         Console.WriteLine("Rectangle class area :");
         return (width * height); 
      }
   }
   class Triangle: Shape
   {
      public Triangle(int a = 0, int b = 0): base(a, b)
      {

      }
      public override int area()
      {
         Console.WriteLine("Triangle class area :");
         return (width * height / 2); 
      }
   }
   class Caller
   {
      public void CallArea(Shape sh)
      {
         int a;
         a = sh.area();
         Console.WriteLine("Area: {0}", a);
      }
   }  
   class Tester
   {

      static void Main(string[] args)
      {
         Caller c = new Caller();
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         c.CallArea(r);
         c.CallArea(t);
         Console.ReadKey();
      }
   }
}

編譯執(zhí)行上述代碼,得到如下結(jié)果:

Rectangle class area:
Area: 70
Triangle class area:
Area: 25
上一篇:基本語法下一篇:方法