2021年7月12日 星期一

JAVA 物件導向的概念-13 介面

  這裡的範例也是 Elton 教我時所寫的,當時寫的註解也相當詳細,但我還用自己的話來解釋一下,雖然 JAVA 不允許多重繼承,但實作多個介面其實就等同於多重繼承。

  當你想要保持類別繼承的簡單性時,介面可能可以幫助你。舉個例子,老鷹和幽浮都會飛,但一個是生物,一個是機械,如果我創造出一個包含了飛行方法的鳥類別來當父類別,讓老鷹類別去繼承鳥類別,這完全符合我們的一般常識;但如果為了讓幽浮類別也擁有飛行的方法而去繼承鳥類別,這就完全不符合常識了,因為幽浮並不是鳥類!

  那麼這時候可以怎麼做呢?我們可以抽出飛行的方法,將之寫成為一個介面,並讓鳥類別與幽浮的類別實作它。以下範例~~

飛行方法的介面:

public interface Flyable {
void fly();

// 介面本身是個特殊的抽像類別,通常用來抽離出不同類別間的共同特性。
// JAVA 的類別只能繼承一個類別,但可以實作多個介面。
// 比方說:它希望鳥類就是自成一個體系,而飛行器又是另外自成一個體系。
// 以避免濫用繼承。
// 但之所以可以實作多個介面,是因為介面是多種物件間的共同特性,故不受此限制。
// 實作其實就是繼承,有 is-a 的關係。
// 同時以程式碼管理的角度,它可以提醒你未實作的程式碼有哪些,不然編譯會出錯。
}

實作飛行方法介面的鳥類別:其中實作的語法是 implement,而覆寫方法如前面的章節所說的同名同回傳值,即可覆寫,不過這裡前面有加上 @Override ,似乎依不同的 IDEA 有的需要加,有的不用。

public class Bird implements Flyable {

@Override
public void fly() {
System.out.println("Fly by the wings");
}
}

實作飛行方法的的幽浮類別:

public class UFO implements Flyable {

@Override
public void fly() {
System.out.println("AntiGravity by an unknow force");
}
}

主程式:

class TestInterface {

public static void main(String[] args) {
Flyable b1 = new Bird(); // 口語的說法:可飛行的 b1 是一隻鳥。
Flyable u1 = new UFO(); // 口語的說法:可飛行的 u1 是一台幽浮。

b1.fly(); // b1 的飛行方法。
u1.fly(); // u1 的飛行方法。
}
}

結果:

Fly by the wings
AntiGravity by an unknow force

Process finished with exit code 0

  實作的意義與繼承相同,但一個類別只可以繼承一個類別,卻可以實作多個介面。如想要你的類別實作多個介面,寫法如下:

class 類別名稱 implements 介面名稱1, 介面名稱2 {

  實作介面1 方法…

  實作介面2 方法…

沒有留言:

張貼留言