好
頻道需要你的支持,謝謝你成為我們的會員(加入會員)
影片1 抽象是用來強迫下層類別 Override 的機制? 抽象類別與抽象方法的使用方式與時機詳解
影片2 介面與抽象類別有什麼不同,使用時機上到底有什麼分別?
影片3 用寫實範例來介紹介面的使用時機與方式。
影片5 新版 Java Interface 中的 default methods 用來做什麼?
影片6 新版 Java Interface 中的 static methods 介紹與介面的繼承
影片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
多型單元的任務分紅中的分紅運算寫成獨立介面。