热门问题
时间线
聊天
视角
協定 (物件導向程式設計)
面向对象编程中的结构类型 来自维基百科,自由的百科全书
Remove ads
在物件導向程式設計中,協定(英語:protocol)或介面(英語:interface)類型[a],是充作類的抽象的資料類型。它描述了一組方法簽章,它們的實現可以由相互之間不必然關聯的多個類來提供[1]。實現了一個介面中列舉出的方法的類,被稱為實現了這個介面[1],或採納了這個協定[2]。
如果對象被完全封裝,則介面是其它對象可以訪問它的唯一方式。例如,在Java中,Comparable
介面規定了其實現類必須實現的一個方法compareTo()
。這意味著比如說排序方法,可以排序實現了Comparable
介面的任何對象的搜集,除了兩個這種對象可以通過compareTo()
的方式進行比較之外,不需要知曉這個類的任何內情。
例子
一些程式語言對介面提供了顯式的語言支援:Ada、C#、D, Dart、Delphi、Go、Java、Logtalk、Object Pascal、Objective-C、OCaml、PHP、Racket、Seed7、Swift、Python(版本3.8以上[3])。在支援多重繼承的語言中,比如C++,介面可以實現為抽象基礎類別。
下面是Java中介面的一個例子:
class Animal { ... }
class Theropod extends Animal { ... }
interface Flyable {
void fly();
}
interface Vocal {
void vocalize();
}
public class Bird extends Theropod implements Flyable, Vocal {
// ...
public void fly() { ... }
public void vocalize() { ... }
}
在沒有顯式支援的語言中,介面經常以叫做鴨子型別的約定形式出現。例如,在Python中,實現了__iter__
方法的任何類都可以用作搜集[4]。
類型類,它出現在語言如Haskell之中,或ML和OCaml的模組簽章之中,有著類似於介面的用途。
在Rust中,介面被稱為特質(英語:trait)[5]。在Rust中,struct
沒有方法,但卻可以實現trait
所聲明的讓struct
來實現的方法:
trait Pet {
fn speak(&self);
}
struct Dog<'a> {
name: &'a str
}
impl<'a> Dog<'a> {
fn new(name: &'a str) -> Self {
Dog { name }
}
}
impl Pet<'a> for Dog<'a> {
fn speak(&self) {
println!("{} says 'Woof!'", self.name);
}
}
Remove ads
參見
- 概念 (泛型編程)
- 委託 (物件導向程式設計)
- Objective-C中的協定
- 介面 (Java)
- 公開介面
- 應用編程介面
注釋
參照
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads