介面 (資訊科技)

-{zh-cn:接口或界面; zh-tw:介面;}-（），-{zh-cn:; zh-tw:}-。介面泛指實體把自己提供給外界（可以為另一實體）的一種抽象化物，用以從與外部溝通時分離出內部操作，使其能被修改內部而不影響外界其他實體與其互動的方式，就如物件導向程式設計提供的多重抽象化。

介面是兩實體交換資料的媒介，交換資料的實體可以是軟體、電腦硬體、外部设备、人等等。有些介面（例如觸控式螢幕）是雙向的，可以傳送資訊，同時接收資訊，有些介面（例如滑鼠或喇叭）則是單向的，只能傳送或接收資訊。人類與電腦等資訊機器或人類與程式之間的介面稱為使用者介面。電腦等資訊機器硬體元件間的介面叫硬體介面。電腦等資訊機器軟體元件間的介面叫軟體介面，其存在於分離的軟體元件間，並提供一種機制使這些元件可以溝通。

介面可能也提供某種意義上的在講不同語言的實體之間的翻譯，諸如人類與電腦之間。因為介面是一種間接手段，所以相比起直接溝通，會引致些額外負擔。

硬體介面

硬體介面為電腦等的資訊機器的硬體之間通信時的物理連接器形狀、傳送接收信號的方法（協定）等等的規格。主要可分為並列連結的和位元序列連結的。序列連結者相比起並列連結者，多得多使用同一電線作為信號控制線和電源供應線。個人電腦領域，因並列連結向更高傳輸速度的發展遇到瓶項，而在向各介面的序列連結方式遷移（參看匯流排）。

軟體介面

軟體介面可能會指不同層次上的各種介面：作業系統和硬體之間會有介面、電腦上運行的应用程序或计算机程序需要有介面來處理字串流、及管道、在面向对象程序设计中，應用程式中的物件會透過方法來和外面互動，這也是一種介面。而軟體間通訊時傳遞消息（message）的規格、行程間通訊或電腦網路也都有介面的特性。

 軟體實務上 
程式編寫或設計的方法論中所關心的介面作為程式元件功能的抽象化，屬於軟體介面的一類。
在程式設計時的一個基本原則是：所有的資源預設都是不允許直接存取的，只允許透過有良好定義的介面來存取。軟體介面提供可以存取電腦系統中資源（例如記憶體、CPU、儲存裝置）的方式。若軟體沒有透過界面存取資源，而是直接存取相關資源，對機能以及穩定性都會造成不良的（而且可能是災難性的）後果。

提供給軟體元件間的介面會被存取到的事物的種類可以包括：常數、資料型別、程序的種類、例外規格、型別簽名。在某些個案，定義變數作為介面的一部份可能會很有用。介面常會透過註解或（於某些實驗性語言）透過正式的邏輯斷言指明那些程序和方法的功能。在面向对象编程中，介面通常定义为一些方法的集合。对对象的属性的存取通常通过存取函式来进行。有時介面中也會定義公共变量。

軟體模組A的介面會刻意的和模組的實現分開定義。模組的實現會包括要有關介面的模組以及介面的實際程式碼，也包括模組中的私有程序及方法。另一個軟體模組 B，假設是軟體模組A的客户端，需通過公開提供的介面才能存取軟體模組A。這樣安排在實務的好處是：若將軟體模組A的實現方式改成其他方式，但介面不變，軟體模組B仍然可以存取軟體模組A，軟體模組A實現介面的作法不會影響B，這就是关注点分离，只關注介面的規格（也可以參照里氏替换原则）。

介面投入使用之后就不应该被修改。如果介面的实现模块提供了新的功能，而想在其他模块中调用这个功能，那么需要定义新的部份而不是修改现存的介面。在物件導向程式設計中，一些支持動態語言的模块实现了IDispatch来支持在运行时“发现”对象提供的函数、方法和事件（通常称为自动化），但是这个通过IDispatch来做代理的方法使得程式性能有所降低。

尽管介面的定义没有强制的标准，但是一些标准的COM介面的应用十分广泛，例如IUnknown和IDispatch。

 物件導向語言中的介面 

在一些面向对象程序设计語言中（特別是沒有完整多重继承的語言），會用「介面」來定義沒有資料，只有方法的抽象資料型別，以此為的簽名（signatures）。任一個具有程式及資料的类，只要有「介面」中所有的方法，就是「實現」此一介面。而且，就算在單一繼承語言中，也可以實現多個介面，因此可以同時「符合」多種型態。

介面是資料類型的定義：物件可以改變其型態（例如子程序或方法呼叫中），方式是用其所實現的介面或基底類，而不是直接列出具體的类。因此所有實現這個介面的类都可以使用。例如在最終實現之前，可以用虛設代碼來讓軟體開發得以進行。另外，在测试驱动开发中，可以在測試過程中用mock物件來取代實際的物件，這類的桩實現會在後續開發中，再改為真正實作的程式碼。

一般而言，介面中的方法沒有實際的程式碼，因此無法執行。若要執行，需要由非抽象的類別實現其介面，讓方法有實際的程式碼，才能執行。例如一種稱為Stack的介面需要支援兩種方法：push() and pop()。可以用不同的方式來實現，例如FastStack及GenericStack，第一個可能是快速的，其資料結構是固定長度的，第二個的資料結構其長度可以調整，不過速度較慢。

介面可能會包括許多方法，不過也有可能只有一種方法，甚至完全沒有方法。例如Java語言定義了介面Readable，只有一個read()方法：會因為不同的用途而有許多不同的實現，例如BufferedReader、FileReader、InputStreamReader、PipedReader及StringReader。像是Serializable等完全沒有方法，是在通用處理時，用反射來提供運行時資訊。

 介面上的程式設計 
介面的使用也可以形成一種稱為「介面上的程式設計」（programming to the interface）的程式設計風格。此作法背後的概念是將程式的邏輯以其物件的介面來呈現，而不是內部實現的細節。介面上的程式設計可以減少和實現相關的相依性，也提高程式的復用性。

控制反转是將上述概念推到極致後的一種設計原則。

使用者介面
使用者介面是指人類與機器、裝置、電腦程式或其他複雜工具互動的中介物的聚合。常用於電腦系統和電子裝置文脈。有時也會將機械系統、交通工具或工業設備的使用者介面稱為人機介面（Human-Machine Interface ，縮寫為 HMI）。

參看
 匯流排 (數據)
 介面卡
 網路介面
 通訊協定
 抽象倒置
 应用二进制接口（ABI）
 应用程序接口（API）



 继承 (计算机科学)

 模块化编程
 基于组件的软件工程
 虚继承

參考資料

Category:信息技术
Category:计算机科学
Category:電子工程
Category:人機互動

Category:程序架构
Category:面向对象的程序设计