精品熟女碰碰人人a久久,多姿,欧美欧美a v日韩中文字幕,日本福利片秋霞国产午夜,欧美成人禁片在线观看

C# 多態性

c# 多態性

多態是同一個行為具有多個不同表現形式或形態的能力。

多態性意味著有多重形式。在面向對象編程范式中,多態性往往表現為"一個接口,多個功能"。

多態性可以是靜態的或動態的。在靜態多態性中,函數的響應是在編譯時發生的。在動態多態性中,函數的響應是在運行時發生的。

在 c# 中,每個類型都是多態的,因為包括用戶定義類型在內的所有類型都繼承自 object。

多態就是同一個接口,使用不同的范例而執行不同操作,如圖所示:

現實中,比如我們按下 f1 鍵這個動作:

  • 如果當前在 flash 界面下彈出的就是 as 3 的幫助文檔;
  • 如果當前在 word 下彈出的就是 word 幫助;
  • 在 windows 下彈出的就是 windows 幫助和支持。

同一個事件發生在不同的對象上會產生不同的結果。

 

1. 靜態多態性

在編譯時,函數和對象的連接機制被稱為早期綁定,也被稱為靜態綁定。c# 提供了兩種技術來實現靜態多態性。分別為:

  • 函數重載
  • 運算符重載

運算符重載將在下一章節討論,接下來我們將討論函數重載。

 

2. 函數重載

您可以在同一個范圍內對相同的函數名有多個定義。函數的定義必須彼此不同,可以是參數列表中的參數類型不同,也可以是參數個數不同。不能重載只有返回類型不同的函數聲明。

下面的范例演示了幾個相同的函數 add(),用于對不同個數參數進行相加處理:

using system;
namespace polymorphismapplication
{
? ? public class testdata ?
? ? { ?
? ? ? ? public int add(int a, int b, int c) ?
? ? ? ? { ?
? ? ? ? ? ? return a + b + c; ?
? ? ? ? } ?
? ? ? ? public int add(int a, int b) ?
? ? ? ? { ?
? ? ? ? ? ? return a + b; ?
? ? ? ? } ?
? ? } ?
? ? class program ?
? ? { ?
? ? ? ? static void main(string[] args) ?
? ? ? ? { ?
? ? ? ? ? ? testdata dataclass = new testdata();
? ? ? ? ? ? int add1 = dataclass.add(1, 2); ?
? ? ? ? ? ? int add2 = dataclass.add(1, 2, 3);

? ? ? ? ? ? console.writeline("add1 :" + add1);
? ? ? ? ? ? console.writeline("add2 :" + add2); ?
? ? ? ? } ?
? ? } ?
}

下面的范例演示了幾個相同的函數 print(),用于打印不同的數據類型:

using system;
namespace polymorphismapplication
{
? ?class printdata
? ?{
? ? ? void print(int i)
? ? ? {
? ? ? ? ?console.writeline("輸出整型: {0}", i );
? ? ? }

? ? ? void print(double f)
? ? ? {
? ? ? ? ?console.writeline("輸出浮點型: {0}" , f);
? ? ? }

? ? ? void print(string s)
? ? ? {
? ? ? ? ?console.writeline("輸出字符串: {0}", s);
? ? ? }
? ? ? static void main(string[] args)
? ? ? {
? ? ? ? ?printdata p = new printdata();
? ? ? ? ?// 調用 print 來打印整數
? ? ? ? ?p.print(1);
? ? ? ? ?// 調用 print 來打印浮點數
? ? ? ? ?p.print(1.23);
? ? ? ? ?// 調用 print 來打印字符串
? ? ? ? ?p.print("hello yapf");
? ? ? ? ?console.readkey();
? ? ? }
? ?}
}

當上面的代碼被編譯和執行時,它會產生下列結果:

輸出整型: 1
輸出浮點型: 1.23
輸出字符串: hello yapf

 

3. 動態多態性

c# 允許您使用關鍵字 abstract 創建抽象類,用于提供接口的部分類的實現。當一個派生類繼承自該抽象類時,實現即完成。抽象類包含抽象方法,抽象方法可被派生類實現。派生類具有更專業的功能。

請注意,下面是有關抽象類的一些規則:

  • 您不能創建一個抽象類的范例。
  • 您不能在一個抽象類外部聲明一個抽象方法。
  • 通過在類定義前面放置關鍵字 sealed,可以將類聲明為密封類。當一個類被聲明為 sealed 時,它不能被繼承。抽象類不能被聲明為 sealed。

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

using system;
namespace polymorphismapplication
{
? ?abstract class shape
? ?{
? ? ? ?abstract public 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 類的面積:");
? ? ? ? ?return (width * length); 
? ? ? }
? ?}

? ?class rectangletester
? ?{
? ? ? static void main(string[] args)
? ? ? {
? ? ? ? ?rectangle r = new rectangle(10, 7);
? ? ? ? ?double a = r.area();
? ? ? ? ?console.writeline("面積: {0}",a);
? ? ? ? ?console.readkey();
? ? ? }
? ?}
}

當上面的代碼被編譯和執行時,它會產生下列結果:

rectangle 類的面積:
面積: 70

當有一個定義在類中的函數需要在繼承類中實現時,可以使用虛方法

虛方法是使用關鍵字 virtual 聲明的。

虛方法可以在不同的繼承類中有不同的實現。

對虛方法的調用是在運行時發生的。

動態多態性是通過 抽象類虛方法 實現的。

以下范例創建了 shape 基類,并創建派生類 circle、 rectangle、triangle, shape 類提供一個名為 draw 的虛擬方法,在每個派生類中重寫該方法以繪制該類的指定形狀。

using system;
using system.collections.generic;

public class shape
{
? ? public int x { get; private set; }
? ? public int y { get; private set; }
? ? public int height { get; set; }
? ? public int width { get; set; }
? ?
? ? // 虛方法
? ? public virtual void draw()
? ? {
? ? ? ? console.writeline("執行基類的畫圖任務");
? ? }
}

class circle : shape
{
? ? public override void draw()
? ? {
? ? ? ? console.writeline("畫一個圓形");
? ? ? ? base.draw();
? ? }
}
class rectangle : shape
{
? ? public override void draw()
? ? {
? ? ? ? console.writeline("畫一個長方形");
? ? ? ? base.draw();
? ? }
}
class triangle : shape
{
? ? public override void draw()
? ? {
? ? ? ? console.writeline("畫一個三角形");
? ? ? ? base.draw();
? ? }
}

class program
{
? ? static void main(string[] args)
? ? {
? ? ? ? // 創建一個 list<shape> 對象,并向該對象添加 circle、triangle 和 rectangle
? ? ? ? var shapes = new list<shape>
? ? ? ? {
? ? ? ? ? ? new rectangle(),
? ? ? ? ? ? new triangle(),
? ? ? ? ? ? new circle()
? ? ? ? };

? ? ? ? // 使用 foreach 循環對該列表的派生類進行循環訪問,并對其中的每個 shape 對象調用 draw 方法 
? ? ? ? foreach (var shape in shapes)
? ? ? ? {
? ? ? ? ? ? shape.draw();
? ? ? ? }

? ? ? ? console.writeline("按下任意鍵退出。");
? ? ? ? console.readkey();
? ? }

}

當上面的代碼被編譯和執行時,它會產生下列結果:

畫一個長方形
執行基類的畫圖任務
畫一個三角形
執行基類的畫圖任務
畫一個圓形
執行基類的畫圖任務
按下任意鍵退出。

下面的程序演示通過虛方法 area() 來計算不同形狀圖像的面積:

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("父類的面積:");
? ? ? ? ?return 0;
? ? ? }
? ?}
? ?class rectangle: shape
? ?{
? ? ? public rectangle( int a=0, int b=0): base(a, b)
? ? ? {

? ? ? }
? ? ? public override int area ()
? ? ? {
? ? ? ? ?console.writeline("rectangle 類的面積:");
? ? ? ? ?return (width * height); 
? ? ? }
? ?}
? ?class triangle: shape
? ?{
? ? ? public triangle(int a = 0, int b = 0): base(a, b)
? ? ? {
? ? ? 
? ? ? }
? ? ? public override int area()
? ? ? {
? ? ? ? ?console.writeline("triangle 類的面積:");
? ? ? ? ?return (width * height / 2); 
? ? ? }
? ?}
? ?class caller
? ?{
? ? ? public void callarea(shape sh)
? ? ? {
? ? ? ? ?int a;
? ? ? ? ?a = sh.area();
? ? ? ? ?console.writeline("面積: {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();
? ? ? }
? ?}
}

當上面的代碼被編譯和執行時,它會產生下列結果:

rectangle 類的面積:
面積:70
triangle 類的面積:
面積:25

下一節:c# 運算符重載

c# 教程

相關文章