多態(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)是在運行時決定。
在編譯時將一個函數(shù)與一個對象連接起來的機制被稱為早期綁定機制。它也被稱為靜態(tài)綁定。C # 提供了兩種技術(shù)實現(xiàn)靜態(tài)多態(tài)性。他們是:
我們將在下一章討論運算符重載。
你可以在同一范圍對同一函數(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++
C# 允許你創(chuàng)建一個抽象類,被用于提供部分類的接口實現(xiàn)。執(zhí)行完成時,派生類繼承它。抽象類(Abstract classes) 包含抽象方法,這是由派生類來實現(xiàn)的。派生類具有更具體化,專業(yè)化的功能。
以下是關(guān)于抽象類的規(guī)則:
下面的程序演示了一個抽象類:
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