热门问题
时间线
聊天
视角

協議 (面向對象編程)

面向对象编程中的结构类型 来自维基百科,自由的百科全书

Remove ads

面向對象編程中,協議(英語:protocol)或接口(英語:interface)類型[a],是充作抽象數據類型。它描述了一組方法簽名,它們的實現可以由相互之間不必然關聯的多個來提供[1]。實現了一個接口中列舉出的方法的類,被稱為實現了這個接口[1],或採納了這個協議[2]

如果對象被完全封裝,則接口是其它對象可以訪問它的唯一方式。例如,在Java中,Comparable接口規定了其實現類必須實現的一個方法compareTo()。這意味着比如說排序方法,可以排序實現了Comparable接口的任何對象的搜集,除了兩個這種對象可以通過compareTo()的方式進行比較之外,不需要知曉這個類的任何內情。

例子

一些編程語言對接口提供了顯式的語言支持:AdaC#D, DartDelphiGoJavaLogtalk英語LogtalkObject PascalObjective-COCamlPHPRacketSeed7英語Seed7SwiftPython(版本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之中,或MLOCaml的模塊簽名之中,有着類似於接口的用途。

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

參見

注釋

引用

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads