介面 (程式设计)

接口界面英语:interface),台湾译为介面,取“仲介之面”之意。介面泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其互动的方式,就如物件导向程式设计提供的多重抽象化。介面可能也提供某种意义上的在讲不同语言的实体之间的翻译,诸如人类与电脑之间。因为介面是一种间接手段,所以相比起直接沟通,会引致些额外负担。

人类与电脑等资讯机器或人类与程式之间的介面称为使用者介面。电脑等资讯机器硬体元件间的介面叫硬体介面。电脑等资讯机器软体元件间的介面叫软体介面,其存在于分离的软体元件间,并提供一种机制使这些元件可以沟通。这条目主要述及程式编写或设计的方法论中所关心的介面,这些介面作为程式元件功能的抽象化,属于软体介面的一类。

实际上的介面

提供给软体元件间的介面会被存取到的事物的种类可以包括:常数资料型别程序的种类、例外规格、型别签名。在某些个案,定义变数作为介面的一部份可能会很有用。介面常会透过注解或(于某些实验性语言)透过正式的逻辑断言指明那些程序和方法的功能。

任一个软体模组 A 的介面被刻意与该模组的实作保持分离。实作包括描述于介面的程序和方法的实际程式码,就如其他“私有”变数、程序等等。任何其他软体模组 B (可以归类为 A 的客户)与 A 互动都被强迫确实真的只透过这介面。这按排的一个实际优点是,替换 A 的实作为符合这介面的相同规范的另一个,应该不会导致 B 故障,只要 B 那些使用到 A 的部份一直遵守这介面的规范(参看 Liskov代换原则)。

介面的使用

面向对象编程中,介面通常定义为一些方法的集合。对对象的属性的存取通常通过属性存取函数来进行。

介面的升级

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

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

参见