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

Slides:



Advertisements
Similar presentations
系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
Advertisements

第一單元 建立java 程式.
第6章 類別與物件 – 封裝 6-1 物件導向的基礎 6-2 Java的類別與物件 – 封裝 6-3 類別的建構子
單元九:單因子變異數分析.
大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
08 CSS 基本語法 8-1 CSS 的演進 8-2 CSS 樣式規則與選擇器 8-3 連結HTML 文件與CSS 樣式表
四資二甲 第三週作業 物件導向程式設計.
第2章 物件導向技術導論 2-1 程式設計方法 2-2 抽象資料型態 2-3 物件導向的思維 2-4 物件導向技術的三大觀念
第7章 C#函數與.NET Framework類別函數庫
第13章 物件導向與例外處理 13-1 物件導向的基礎 13-2 類別與物件 13-3 類別的繼承 13-4 PHP的例外處理
第一章 面向对象程序设计.
第4章 XML與Java物件導向程式設計 4-1 XML的基礎 4-2 類別與物件 4-3 類別的繼承 4-4 巢狀類別與匿名內層類別
06 類別與物件. 06 類別與物件 6.1 類別與物件 目前的程式設計主流是物件導向 (OOP),Visual C# 已提供完整的物件導向功能。在物件導向設計裡,物件可以被封裝 ( 保護) 和繼承 ( 重複使用)。因為物件的封裝會使物件受到保護,要存取物件必須透過屬性 (Property)、方法.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Java簡介.
Visual C++ introduction
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
簡易C++除錯技巧 長庚大學機械系
JAVA 程式設計與資料結構 第七章 繼承與Interface.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
客戶端的檔案上傳 HtmlInputFile檔案控制項 上傳單一檔案 同時上傳多個檔案.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
Ch10 類別與物件-方法 Java程式設計(2).
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
C語言簡介 日期 : 2018/12/2.
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
R教學 安裝RStudio 羅琪老師.
Java程序设计 第9章 继承和多态.
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
程式設計(二) 進階類別 郭文真 Sabrina Kuo.
類別的繼承 Vehicle Car.
第七章 檔案處理.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Topic Introduction—RMI
第一單元 建立java 程式.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
Ch20. 計算器 (Mac 版本).
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
第 19 章 XML記憶體執行模式.
CH05. 選擇敘述.
挑戰C++程式語言 ──第8章 進一步談字元與字串
LINQ資料查詢技術.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
第三章 数据抽象.
MicroSim pspice.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
OOP9 類別Class.
陣列與結構.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
方法進階及物件導向基礎 Lecturer: 楊昌樺.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
第一讲 面向对象方法学与信息系统建模.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
第6章 继承和多态 伍孝金
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

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

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

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

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

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

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

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。

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

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

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

11-1-4 過載的建構子-說明 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;

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

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物件的利潤和銷售項目總和。 我們可以看出寫出的運算式和基本資料型別是相同的語法,換句話說,運算子過載的目的是增加程式碼的可讀性,避免發生不一致的語法。

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

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; }

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

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

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

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

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;

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

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

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

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

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

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

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

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

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()方法來取得長方形面積。

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

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

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

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

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

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

End