iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Software Development

深入淺出Java 30天系列 第 23

Day 23: 偏好使用interface而不是抽象類別(abstract class)(上)

  • 分享至 

  • xImage
  •  

Java的世界裡,提供了兩種機制幫助定義類別的架構,一個是interface,一個是抽象類別。這兩種機制主要的差別在於,一個是使用實作的方式,一個是使用繼承的方式,去實現類別的功能。

抽象類別可以事先實作好方法要做的事,interface則只是定義好需要哪些方法,乍看之下抽象類別能重複使用程式碼,似乎更方便,但使用抽象類別會有一些缺點,所以還是鼓勵使用interface而不是抽象類別,原因有:

  • Java的類別並沒有多重繼承,如果選擇使用抽象類別,只能選擇一個抽象類別去定義你的類別,未來要新增類別型態(Class type),會因為無法多重繼承,所以也無法增加類別型態(Class type)。但類別可以實作多個interface,可以更彈性的增加類別型態。
  • 因為抽象類別是使用繼承的方式,會讓原本不相關的類別,因為繼承了同一個抽象類別,而有了同一個祖先,破壞了原本的程式結構。如果是重構或修改既有的程式碼,建議使用interface,只要加上需要實作的方法,就可以輕鬆地讓原有類別有不同的類別型態。
  • 雖然Java的類別和抽象類別沒有多重繼承,但是interface可以,如果類別需混合多種類別型態(mixins),可以透過interface的多重繼承,實現這個目標。如下面範例所示,MultiFunctionDevice繼承了PrintableScanableMultiFunctionPrinter再實作MultiFunctionDevice
// 定義兩個接口
interface Printable {
    void print();
}

interface Scanable {
    void scan();
}

// 定義一個接口繼承自兩個接口
interface MultiFunctionDevice extends Printable, Scanable {
    void copy();
}

// 實現多重繼承的接口
public class MultiFunctionPrinter implements MultiFunctionDevice {
    @Override
    public void print() {
        System.out.println("Printing...");
    }

    @Override
    public void scan() {
        System.out.println("Scanning...");
    }

    @Override
    public void copy() {
        System.out.println("Copying...");
    }

    public static void main(String[] args) {
        MultiFunctionPrinter mfp = new MultiFunctionPrinter();
        mfp.print();
        mfp.scan();
        mfp.copy();
    }
}

今天說了為什麼使用interface比較好,但其實interface也是有一些缺點,明天再來談談有什麼缺點,可以怎麼優化~


上一篇
Day 22: 設計並記錄繼承的使用方式,否則禁止使用繼承
下一篇
Day 24: 偏好使用interfaces而不是抽象類別(abstract class)(下)
系列文
深入淺出Java 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言