用戶:小朱/sandbox4
介面 (interface) 是物件導向程式設計中的成員之一,它定義了軟件元件(software component)所必須要遵循的規範,只要是要取用某個軟件框架(framework)或是為軟件添加特定由軟件框架所內建的功能時,在主程式與元件間的溝通,就是要利用介面。它也是不同軟件元件間的溝通橋樑,當程式兩方(不論是元件或用戶端程式)要相互溝通時,都要透過介面來識別。介面也是在物件導向領域中廣為應用作為降低耦合度的方法。
概念
介面的應用是物件導向中多型(Polymorphism)性質的一種,在物件導向領域中,被廣為用來規定軟件的特定行為(behavior)或功能(function),包含方法的簽名碼(signature),而要具備某些功能的軟件元件要實作(implement)元件內指定的功能,而用戶端要使用介面執行個體的方式來存取軟件元件,透過如此的作法可以將軟件元件或是用戶端對特定軟件元件的耦合性完全消除,藉以達成在不更動主程式或用戶端的情況下,自由的插拔或抽換不同的軟件元件。
一個介面成員的宣告通常包含了:
- 成員名稱。
- 成員類型(屬性或方法)。
- 成員回傳的資料型態(data type)。
- 成員所需的參數(arguments/parameters)。
下列程式碼即為 Java 的介面範例:
public interface IPredator {
boolean chasePrey(Prey p);
void eatPrey(Prey p);
}
當一個類別決定實作特定介面時,則其類別內必須包含介面所有成員的實作(但內容不一定要實作,可以擲回例外,回傳特定數值或是保持空白等),當用戶端程式呼叫時,就是呼叫介面所定義的方法,實際處理此呼叫的即為此類別實作的介面方法。下列程式即為實作介面的類別的 Java 程式範例:
public class Lion implements IPredator {
public boolean chasePrey(Prey p) {
// programming to chase prey p (specifically for a lion)
}
public void eatPrey (Prey p) {
// programming to eat prey p (specifically for a lion)
}
}
下列為用戶端的呼叫範例:
IPredator predatorObject = PredatorFactory.Create("Lion");
predatorObject.chasePrey(new Prey());
功能
介面有下列功能:
- 合約化軟件元件,介面具有強大的約束力,一旦軟件元件明確的要求實作某個介面,就表示該軟件元件一定具有該介面所定義的功能(但軟件元件不一定會完全實作該介面的成員),用戶端也可以明確的將軟件元件的執行個體轉換為介面執行個體,並用來呼叫軟件元件中所實作的介面成員,它的作用就有如軟件元件和用戶端共同簽署了合約(contract)一般,雙方均受合約的約束。
- 切斷耦合性,當用戶端藉由參考介面來使用軟件元件時,用戶端程式對軟件元件就只是間接參考(indirect reference),表示用戶端程式不再相依(depend)於特定的軟件元件,只要利用介面以及設計模式中的抽象工廠方法(Abstract Factory Method Pattern),即可自由的透過組態檔案(configuration file)或中介資料(metadata)抽換或更動不同的軟件元件。
應用
介面在物件導向領域,尤其是設計模式中被廣泛的應用,由於它具有強制約束以及鬆散耦合 (Loose-coupling) 的特性,讓許多的軟件模式廣為應用介面來發展。
COM
COM(元件物件模型)是微軟的軟件元件框架之一,於 1993 年發展出來,透過由系統提供的 COM 用戶端函式庫以及標準的介面,所有的軟件元件都可以利用 IUnknown/IDispatch 來達成查詢軟件元件內介面以及與其他平台元件互通的能力。