跳到主要內容

物件導向觀念深入4 - 抽象類別、抽象方法與介面


頻道需要你的支持謝謝你成為我們的會員(加入會員)

影片1 抽象是用來強迫下層類別 Override 的機制? 抽象類別與抽象方法的使用方式與時機詳解 



影片2 介面與抽象類別有什麼不同,使用時機上到底有什麼分別?



影片3 用寫實範例來介紹介面的使用時機與方式



影片4 介面的建立與實作。



影片5 新版 Java Interface 中的 default methods 用來做什麼?




影片6 新版 Java Interface 中的 static methods 介紹與介面的繼承



影片7 任務1: 退貨系統。



影片8 任務2: 交通工具 。任務3: 遊戲角色。 任務4:員工分紅2。



範例

一、抽象類別

1.          用關鍵字 abstract 宣告的類別。

2.          可以包含或不包含抽象方法。

3.          不可以被實體化,但可以被繼承

4.          可以用來宣告參考變數,做多型的應用。

二、抽象方法

1.          宣告時必須加關鍵字abstract。不可以有 method body

2.          只能存在於抽象類別中
擁有抽象方法的類別,一定要宣告為抽象類別。所以。繼承時。要注意是否有繼承抽象方法。如果有繼承抽象方法,就一定要override抽象方法。否則,就必須宣告為抽象類別。換言之,抽象方法是一個強迫下層類別 Override 的機制

三、介面

在物件導向程式開發的過程,介面的角色越來越重要。介面可以視同為不同開發群組之間的規格書。不同的開發群組,開發風格完全不一樣的程式。但是都符合同一規格。那麼這一群程式就可以互動。

 

假設,有一個國家要開放電動車。要求所有在路上行駛的電動車必須接受中央控制系統管理。這個中央控制系統,會在交通號誌裡面安裝訊號發射器。在燈號變化的時候,透過衛星發送訊息要求車輛行駛、停止。也就是說,每一輛車都要能夠接收這個訊息的控制。問題是,車輛是不同廠牌的公司製作出來的。車上安裝的是不同開發團隊寫出來的程式。要如何才能讓中央控制系統可以控制所有的車輛呢?中央控制系統必須提出一個規格,要求各個廠商開發程式的時候要符合這個規格。符合這個規格,能夠讓我中央控制系統控制,才允許該廠牌的車上路。這就是規格的重要性。

 

假設,本團隊要開發一個遊戲:模擬城市。在這個城市之中,有交通工具、人物及動物。交通工具、人物及動物要交由不同的小組開發類別。開發後的類別的物件,要能夠讓城市主系統控制。

城市主系統要求無論是交通工具、人物或動物。都必須有:啟動、暫停與停止。所以我們就把這3個功能定義為規格(宣告為介面)。要求各個開發小組,他們開發類別時,可以發揮自己的創意任意開發,但無論如何要符合這個規格,也就是一定要有這3個功能(實作介面)。這樣,各個小組開發出來的類別的物件,都能夠在接受城市主系統控制,在這一個模擬城市中互動。

 

而這樣的開發模式。除了讓開發的團隊更加有彈性之外,也增加了安全性隱密性以及日後維護的便利性。因為只要符合規格,其他的細節開發者可以自由發揮,日後也隨時可以調整,只要規格不變就可以了。所以現在很多商業軟體,它公佈的都是介面,不會公佈他的實作類別。

 

Q. 介面與抽象類別什麼地方不一樣?

A. 界面讓是不同繼承體系的類別擁有相同的規格(型別)的機制

 

1.      宣告與實作

Java 中。介面與類別一樣,都是型別,可以用來宣告參考變數。但差異是:介面,不會有實體,它沒有建構方法。介面可以視同為一個抽象型別

介面是讓類別實作。而實作了介面的類別的物件便 is-a 該介面的物件。此物件就可以指派給以介面宣告的參考變數(多型)

實作介面的類別,必須 Override 介面中的所有抽象方法。否則類別就要宣告為抽象類別。一個類別可以實作一個以上的介面。介面名稱用逗點隔開。若不同的介面中有相同簽章的抽象方法,Override 一個就可以

實作介面的類別若要繼承父類別,繼承必須先寫

2.      可包含

                            i.                constants

預設為 public, static, final, 必須在宣告敍述指派

                           ii.                method signatures

預設為 public, abstract 不可以有method body

                         iii.                default methods

預設為 public實作介面的類別的“物件成員方法”。可以用來增強介面的新功能而不必修改己經實作的類別

設計師也可以為 Library中的介面撰寫程式碼,新增介面的功能。而且確保它跟舊版介面之間的相容性。(不必修改實作舊版介面的類別)

若類別中有相同名稱的方法,視同為 Override

                         iv.                static methods

預設為 public, 介面的“靜態成員方法”。多數類別會用到的靜態方法,可以寫在介面。而不必分別寫在類別之中。

這讓我們方便組織輔助方法(helper methods),將 static method 宣告在介面中,而不是在各個單獨的類別。

                           v.                nested types

介面中可以宣告內部型別 (class, enum) 來協助運算

3.      繼承

介面可以繼承介面,而且可以繼承一個以上的介面。各個父介面的名稱用逗點隔開

子介面繼承父介面中除了 static 之外的所有成員。

                            i.                default method

l   直接繼承,不做任何變更。

l   重新宣告為抽象方法。

l   重新宣告方法,並且定義它。等同 Override

l   不同的父介面不可以有相同名稱的 default method


 

任務1:

退貨系統。

本公司接受一家賣場的要求,開發退貨系統。賣場的商品分為:食物類、服裝類、生活用品類與電子產品類。

食物類又分為飲料、食品。飲料又分為易開罐飲料與瓶裝飲料。其中,易開罐飲料開罐之後不可退貨。

生活用品類分為居家、外出。外出用品有瓦斯爐與瓦斯罐,其中瓦斯罐不可退貨。

服裝類有一般衣服與訂製衣服,其中定製衣服不可退貨。

電子產品類有網路卡與記憶卡,其中記憶卡不可退貨。

其他產品均可退貨。請寫出一個基本框架,符合這個要求。

 

任務2:

交通工具。

未來世界中的某一個城市的市長。想要開發一套軟體控制城市中的所有交通工具。交通工具分為水上、路上與空中三種。

這三種的交通工具中都一定有啟動、關閉、加速與減速功能。

空中交通工具必須有起飛與降落功能。

水上交通工具必須有巡航功能。

陸上交通工具必須有左轉、右轉與迴轉功能。

 

空中交通工具有飛機、直升機。

水上交通工具有輪船。遊艇。

陸上交通工具有機車、汽車。

 

另外還有:

水上飛機擁有空中與水上交通工具的所有功能。

飛天車可同時擁有路上與空中交通工具的功能。

潛水車可以同時擁有水上與陸上交通工具的功能。

 

請寫出一個框架,符合上述的要求。

 

任務3:

遊戲角色

本團隊被要求開發一個遊戲軟體,軟體中的角色有人物、車輛和動物。每一個角色都要有左轉與右轉的功能,而車輛有多一個迴轉功能。請設計一套含介面的框架,符合這個要求。當角色物件呼叫左轉或右轉方法時,給予轉動次數,角色的方向會改變。

假設某一物件建立時,預設的方向為東。該物件左轉一次後其方向為北。

 

任務4:

員工分紅2

多型單元的任務分紅中的分紅運算寫成獨立介面。