在面向对象编程中,协议()或接口()类型,是充作类的抽象的数据类型。它描述了一组方法签名,它们的实现可以由相互之间不必然关联的多个类来提供。实现了一个接口中列举出的方法的类,被称为实现了这个接口。
如果对象被完全封装,则接口是其它对象可以访问它的唯一方式。例如,在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 {
name: &'a str
}
impl Dog {
fn new(name: &'a str) -> Self {
Dog { name }
}
}
impl Pet for Dog {
fn speak(&self) {
println!("{} says 'Woof!'", self.name);
}
}
参见
*
- 委托 (面向对象编程)
- Objective-C中的协议
- 接口 (Java)
*
- 应用编程接口
注释
引用
评论 (0)