热门问题
时间线
聊天
视角

协议 (面向对象编程)

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

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