优秀的编程知识分享平台

网站首页 > 技术文章 正文

仓颉编程语言基础-面向对象编程-接口(Interface)核心特性

nanyue 2025-08-01 19:39:53 技术文章 2 ℃

接口的本质

  • 抽象行为约束接口定义抽象类型,不含数据仅声明行为(方法、操作符重载、属性)。
  • 实现要求类型实现接口时,必须提供接口中所有成员的具体实现
  • 子类型关系实现接口的类型自动成为接口的子类型(可向上转型)。

接口定义

接口使用关键字 interface 声明,其后是接口的标识符和接口的成员。接口默认具有 open 语义,所以 interface 定义时的 open 修饰符是可选的。

当某个类型实现了某个接口之后,该类型就会成为该接口的子类型。

interface Flyable {
    func fly(): Unit  // 抽象方法
}
class Bird <: Flyable {
    public func fly(): Unit {  // 必须实现
        println("Bird flying")
    }
}

静态成员

  • 默认实现:接口可包含静态方法/属性的默认实现
  • 实现可选性:若接口有默认静态实现,实现类可不重写(直接继承)。
  • 泛型约束:常用于泛型函数中对静态成员的抽象(如 T.typename())。

继承与多实现

多接口实现:用 & 分隔多个接口:

class MyInt <: Addable & Subtractable { ... }

接口继承:接口可继承其他接口(不可继承类),并扩展新成员:

interface Calculable <: Addable & Subtractable {
    func mul(other: Int64): Int64  // 新增方法
}

接口实现的要求

类型支持除元组(Tuple)、变长数组(VArray)、函数外,其他类型均可实现接口。

实现途径

  • 类型声明时实现(最常见)
  • 通过扩展(Extension)实现
  • 语言内置实现(如标准库)
  • 默认实现冲突:若多个父接口有同名默认方法,实现类必须重写该方法

实现类型声明实现接口时,需要实现接口中要求的所有成员,为此需要满足下面一些规则。

  • 对于成员函数和操作符重载函数,要求实现类型提供的函数实现与接口对应的函数名称相同、参数列表相同、返回类型相同。
  • 对于成员属性,要求是否被 mut 修饰保持一致,并且属性的类型相同。

Any 类型

  • 顶级接口:所有接口默认继承 Any,所有非接口类型默认实现 Any。
  • 泛用容器:可持有任意类型的值:
var any: Any = 1
any = "Hello"  // 合法
最近发表
标签列表