Presentation is loading. Please wait.

Presentation is loading. Please wait.

第11章 過載與多形 11-1 方法的過載 11-2 運算子的過載 11-3 再談抽象類別與介面 11-4 多形的基礎 11-5 實作多形.

Similar presentations


Presentation on theme: "第11章 過載與多形 11-1 方法的過載 11-2 運算子的過載 11-3 再談抽象類別與介面 11-4 多形的基礎 11-5 實作多形."— Presentation transcript:

1 第11章 過載與多形 11-1 方法的過載 11-2 運算子的過載 11-3 再談抽象類別與介面 11-4 多形的基礎 11-5 實作多形

2 11-1 方法的過載 訊息 類別方法的過載 成員方法的過載 過載的建構子

3 訊息-說明 物件可以模擬現實生活的東西,但是現實生活中的東西會彼此互動。例如:學生要求成績(學生與成績物件)、約同學看電影(同學與同學物件)和學生彈鋼琴(學生與鋼琴物件)等互動。所以,我們建立的物件之間也需要互動,使用的媒介就是訊息(Messages)。 物件是使用訊息來模擬彼此的互動,換句話說,訊息是物件之間的溝通橋樑,可以啟動另一個物件來執行指定的行為。

4 訊息-圖例 例如:Student學生物件需要查詢成績,學生成績是儲存在StudentStatus物件,此時Student物件可以送一個訊息給StudentStatus物件,告訴它需要查詢學生的成績,如下圖所示:

5 類別方法的過載-說明 「過載」(Overload)或重載是在類別建立同名的方法。因為物件導向技術的物件是依接收的訊息(Messages)來執行不同的方法,換句話說,物件只要能夠辨識是不同的訊息,就算是同名方法,也一樣可以正確的執行方法。 在C#類別允許擁有2個以上的同名方法,稱為過載(Overload),過載方法只需傳遞參數個數或資料型別不同即可,傳回值型別不屬於方法特徵(Method Signature),所以不同並不會視為是不同的方法。

6 11-1-2 類別方法的過載-參數型別不同 C#方法只需參數的資料型別不同,就可以建立過載方法,如下所示:
static public int Square(int value){ … } static public double Square(double value){ … } 上述2個同名方法Square()可以計算參數的平方,方法只有參數的資料型別不同,個數是相同的。

7 11-1-2 類別方法的過載-參數個數不同 C#方法只需參數的個數不同,也一樣可以建立過載方法,如下所示:
static public int Plus(int a, int b){ … } static public int Plus(int a, int b, int c){ … } 上述同名方法Plus()可以計算參數的和,方法的參數個數分別為2和3。

8 11-1-2 類別方法的過載-Visual C#專案
Visual C#專案:Ch11_1_2 在Windows應用程式專案的Class1.cs類別檔宣告MyMath類別,使用過載建立2個同名的類別方法Square()和Plus(),只是參數型別和個數不同,如下圖所示:

9 成員方法的過載-說明 C#類別的成員方法如同類別方法,也一樣可以擁有兩個以上的同名方法,只需傳遞的參數個數或資料型別不同即可,例如:在MyDate類別擁有2個同名SetDate()的過載方法,如下所示: public void SetDate(int y, int m, int d) { … } public void SetDate(int y, int m) { … } 上述同名方法的參數個數分別是3個和2個。

10 11-1-3 成員方法的過載-Visual C#專案
Visual C#專案:Ch11_1_3 在Window應用程式專案的Class1.cs類別檔宣告MyDate類別,可以使用過載方法指定物件的成員變數值,如下圖所示:

11 過載的建構子-說明 C#類別可以建立多個同名的建構子方法,只需擁有不同的參數型別或個數即可。例如:MyDate類別擁有多個同名的建構子,如下所示: public class MyDate { public MyDate(int y, int m, int d) Year = y; Month = m; Day = d; } public MyDate(int m, int d) Year = 2011; Month = m; Day = d;

12 11-1-4 過載的建構子-Visual C#專案 Visual C#專案:Ch11_1_4
在Window應用程式專案的Class1.cs類別檔宣告MyDate類別,這是修改至第11-1-3節的MyDate類別,將過載方法改為過載建構子,如下圖所示:

13 11-2 運算子的過載-說明 運算子過載(Operator Overloading)可以將C#運算子使用在自訂類別的物件。例如:業績物件Sales使用"+"過載運算子計算業績物件利潤和項目的總和,如下所示: Sales q1 = new Sales(2345.6, 250); Sales q2 = new Sales(1234.5, 150); Sales total; total = q1 + q2; 上述程式碼是將第一季q1和第二季q2物件,使用“+”過載運算子計算上半年業績total物件的利潤和銷售項目總和。 我們可以看出寫出的運算式和基本資料型別是相同的語法,換句話說,運算子過載的目的是增加程式碼的可讀性,避免發生不一致的語法。

14 11-2 運算子的過載-支援的運算子 C#語言的大部分運算子都可以過載,如下表所示: 運算子 說明
+、-、!、~、++、--、true、false 單運算元的運算子可以過載 +、-、*、/、%、&、|、^、<<、>> 雙運算元的運算子可以過載 ==、!=、<、>、<=、>= 比較運算子可以過載,不過運算子過載需成對,例如:過載==,就需同時過載!=

15 11-2 運算子的過載-運算子方法 C#的過載運算子是使用operator關鍵字建立運算子方法(Operator Method),這是一種類別方法,例如:Sales物件加法的運算子方法,如下所示: public static Sales operator +(Sales s1, Sales s2) { Sales temp = new Sales(0.0, 0); temp.Earnings = s1.Earnings + s2.Earnings; temp.SoldedItems = s1.SoldedItems + s2.SoldedItems; return temp; }

16 11-2 運算子的過載-Visual C#專案 Visual C#專案:Ch11_2
在Windows應用程式專案的Class1.cs類別檔宣告Sales類別,然後建立加法的運算子過載,以便計算業績物件的利潤和銷售項目總和,如下圖所示:

17 11-3 再談抽象類別與介面- 抽象類別與介面的差異
抽象類別與介面的主要差異,如下所示: 抽象類別的方法可以宣告成抽象方法,也可以是一般方法;介面方法就只有宣告,在介面一定不會有實作的程式碼。 介面並不屬於類別的繼承架構;抽象類別屬於類別的繼承架構。抽象類別一定是繼承架構的父類別,但是,就算亳無關係的類別也一樣可以實作同一個介面。 一個類別只能繼承一個抽象類別,但是可以同時實作多個介面。

18 11-3 再談抽象類別與介面- 繼承抽象類別且實作介面(1)
C#語言的類別可以繼承抽象類別且實作介面。例如:Shape圖形的抽象類別,其類別宣告如下所示: abstract class Shape { public double X; public double Y; public abstract double Area(); } 例如:IPerimeter介面,其介面宣告如下所示: interface IPerimeter double Perimeter();

19 11-3 再談抽象類別與介面- 繼承抽象類別且實作介面(2)
我們可以宣告Rectangle類別繼承Shape抽象類別,並且實作IPerimeter介面,其類別宣告如下所示: class Rectangle : Shape, IPerimeter { public override double Area() { return (Width * Height); } public double Perimeter() { return (2 * (Width + Height)); } }

20 11-3 再談抽象類別與介面- 介面的物件變數 在C#程式碼可以使用介面宣告物件變數來參考到實作此介面的物件,如下所示:
IPerimeter r3 = new Rectangle(15.0,15.0,4.0,8.0); 因為IPerimeter宣告的物件變數可以參考Rectangle物件(C#的is運算子可以判斷參考的物件,例如:(r3 is Rectangle)運算式可以判斷r3是否是參考Rectangle物件),所以,我們可以呼叫實作的介面方法Perimeter(),如下所示: r3.Perimeter(); 當抽象類別或介面宣告的物件變數需要存取其參考類別的成員時,我們需要先型別轉換成Rectangle類別的物件變數,如下所示: Rectangle r; r = (Rectangle) r3;

21 11-3 再談抽象類別與介面- Visual C#專案
Visual C#專案:Ch11_3 在Windows應用程式專案的Class.cs類別檔宣告抽象類別Shape和介面IPerimeter後,宣告Rectangle類別繼承Shape類別且實作IPerimeter介面後,可以顯示3個不同尺寸長方形的相關資料,如右圖所示:

22 11-4 多形的基礎-說明 「多形」(Ploymorphism)是物件導向程式設計重要且複雜的觀念,它可以讓應用程式更容易擴充,一個同名方法,就可以處理不同資料型別的物件,產生不同的操作。 物件導向的過載與多形機制是架構在訊息和物件的「靜態連結」(Static Binding)與「動態連結」(Dynamic Binding)之上。

23 11-4 多形的基礎-靜態連結 靜態連結(Static Binding)的訊息是在編譯階段,就決定其送往的目標物件。例如:第11-1-4節的GetDate()方法是在編譯時就建立訊息和物件的連結,也稱為「早期連結」(Early Binding)。 事實上,Visual C#專案Ch11_1_4的訊息是在編譯時就決定送達的目標物件是MyBirthday和LuckDay,如下圖所示:

24 11-4 多形的基礎-動態連結 動態連結(Dynamic Binding)的訊息是直到執行階段,才知道訊息送往的目標物件,這就是多形擁有彈性的主要原因,也稱為「延遲連結」(Late Binding)。 在第11-1節筆者說明靜態連結的過載方法,在第11-5節將說明動態連結的多形。

25 11-5 實作多形 類別繼承實作多形 使用介面實作多形

26 11-5 實作多形-三種方式 方法過載(Method Overloading):方法過載也屬於多形,屬於一種靜態連結的多形。
類別繼承的方法覆寫(Method Overriding Through Inheritance):繼承父類別覆寫同名的虛擬方法或實作同名的抽象方法,就可以處理不同資料型別的物件。如果有新類別,只需新增繼承的子類別和實作方法。 介面的方法覆寫(Method Overriding Through the C# Interface):因為不同類別可以實作同一個介面,所以我們也可以透過介面來實作多形。

27 11-5-1 類別繼承實作多形-抽象類別Shape
abstract class Shape { public abstract double Area(); }

28 11-5-1 類別繼承實作多形-子類別 class Circle : Shape { ………
public override double Area() { return ( * r * r); } class Rectangle : Shape { return (height * width);

29 11-5-1 類別繼承實作多形-多形方法 現在我們可以建立Circle和Rectangle物件c和r,如下:
Circle c = new Circle(); Rectangle r = new Rectangle(); 我們可以宣告Shape物件變數s參考Circle或Rectangle物件,如下所示: Shape s; s = r; lblOutput.Text += "面積: " + s.Area() + "\n"; 當物件變數s是參考Rectangle物件時,可以呼叫相同s.Area()方法來取得長方形面積。

30 類別繼承實作多形-動態連結 在物件導向技術的物件呼叫一個方法,就是送一個訊息給物件,告訴物件需要執行什麼方法,現在s.Area()將訊息送到s物件變數參考的物件,如下圖所示:

31 11-5-1 類別繼承實作多形-Visual C#專案
Visual C#專案:Ch11_5_1 在Windows應用程式專案的Class.cs類別檔宣告Shape抽象類別,然後宣告Circle和Rectangle類別來繼承Shape類別,以便建立多形方法Area(),如下圖所示:

32 11-5-2 使用介面實作多形-IArea介面 多形也可以實作介面方法來建立多形。例如:IArea介面,其介面宣告如下所示:
interface IArea { double Area(); }

33 11-5-2 使用介面實作多形-實作介面 class Circle : IArea { ……… public double Area() {
return ( * r * r); } class Rectangle : IArea { return (height * width);

34 使用介面實作多形-多形方法 如同第11-5-1節,我們一樣可以將物件變數s指定成Circle或Rectangle物件,然後使用相同的s.Area()程式碼呼叫來計算圖形面積,換句話說,Area()方法就是多形。

35 11-5-2 使用介面實作多形-Visual C#專案
Visual C#專案:Ch11_5_2 在Windows應用程式專案的Class.cs類別檔宣告IArea介面,然後宣告Circle和Rectangle類別來實作IArea介面,以便建立多形方法Area(),如下圖所示:

36 End


Download ppt "第11章 過載與多形 11-1 方法的過載 11-2 運算子的過載 11-3 再談抽象類別與介面 11-4 多形的基礎 11-5 實作多形."

Similar presentations


Ads by Google