协议 (面向对象编程)

在面向对象编程中，协议（）或接口（）类型，是充作类的抽象的数据类型。它描述了一组方法签名，它们的实现可以由相互之间不必然关联的多个类来提供。实现了一个接口中列举出的方法的类，被称为实现了这个接口，或采纳了这个协议。

如果对象被完全封装，则接口是其它对象可以访问它的唯一方式。例如，在Java中，Comparable接口规定了其实现类必须实现的一个方法compareTo()。这意味着比如说排序方法，可以排序实现了Comparable接口的任何对象的搜集，除了两个这种对象可以通过compareTo()的方式进行比较之外，不需要知晓这个类的任何内情。

 例子 

一些编程语言对接口提供了显式的语言支持：Ada、C#、D, Dart、Delphi、Go、Java、、Object Pascal、Objective-C、OCaml、PHP、Racket、、Swift、Python（版本3.8以上）。在支持多重继承的语言中，比如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__方法的任何类都可以用作搜集。

类型类，它出现在语言如Haskell之中，或ML和OCaml的模块签名之中，有着类似于接口的用途。

在Rust中，接口被称为特质（）。在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);
    }
}

参见

 委托 (面向对象编程)
 Objective-C中的协议
 接口 (Java)

 应用编程接口

注释

引用

Category:面向对象的程序设计