热门问题
时间线
聊天
视角
協議 (面向對象編程)
面向对象编程中的结构类型 来自维基百科,自由的百科全书
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