C# 多態(tài)性

2018-09-27 16:29 更新

多態(tài)性

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

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

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

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

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

我們將在下一章討論運(yùn)算符重載。

函數(shù)重載

你可以在同一范圍對(duì)同一函數(shù)名有多重定義。該函數(shù)的定義必須用不同的類型或通過(guò)參數(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ù)打印浮點(diǎn)型
         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++

動(dòng)態(tài)多態(tài)性

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

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

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

下面的程序演示了一個(gè)抽象類:

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)你在一個(gè)類中有定義函數(shù),并且希望它可以在一個(gè)被繼承的類中實(shí)現(xiàn)功能時(shí),你可以使用虛函數(shù)(virtual functions) 。虛函數(shù)可以在不同的被繼承的類中實(shí)現(xiàn),并且將在程序運(yùn)行時(shí)調(diào)用此類函數(shù)。

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

下列程序證實(shí)了上述說(shuō)法:

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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)