网站首页 > 技术文章 正文
接口的本质
- 抽象行为约束:接口定义抽象类型,不含数据,仅声明行为(方法、操作符重载、属性)。
 - 实现要求:类型实现接口时,必须提供接口中所有成员的具体实现。
 - 子类型关系:实现接口的类型自动成为接口的子类型(可向上转型)。
 
接口定义
接口使用关键字 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"  // 合法
    
- 上一篇: 《学习C++》基本概念之标识符
 - 下一篇: 《学习C++》之基本概念
 
猜你喜欢
- 2025-08-01 Visual C++对C/C++新标准的支持有何诟病之处?C语言有哪些标准?
 - 2025-08-01 《学习C++》基本概念之名称
 - 2025-08-01 《学习C++》之基本概念
 - 2025-08-01 《学习C++》基本概念之标识符
 - 2025-05-08 定义变量类型总是在变量前面吗?如何理解typedef定义的类型?
 - 2025-05-08 7. 包管理与模块(包和模块的区别)
 - 2025-05-08 Python基础知识:什么是非局部语句?
 - 2025-05-08 苹果来真的!明年起不符合隐私要求的App将从应用商店移除
 - 2025-05-08 Java枚举(java枚举菜鸟教程)
 - 2025-05-08 可验证凭证(VC):数字时代的重要信任基石
 
- 最近发表
 - 
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
 - [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
 - 超详细手把手搭建在ubuntu系统的FFmpeg环境
 - Nginx运维之路(Docker多段构建新版本并增加第三方模
 - 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
 - Go 人脸识别教程_piwigo人脸识别
 - 安卓手机安装Termux——搭建移动服务器
 - ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
 - Rust开发环境搭建指南:从安装到镜像配置的零坑实践
 - Windows系统安装VirtualBox构造本地Linux开发环境
 
 
- 标签列表
 - 
- cmd/c (90)
 - c++中::是什么意思 (84)
 - 标签用于 (71)
 - 主键只能有一个吗 (77)
 - c#console.writeline不显示 (95)
 - pythoncase语句 (88)
 - es6includes (74)
 - sqlset (76)
 - apt-getinstall-y (100)
 - node_modules怎么生成 (87)
 - chromepost (71)
 - flexdirection (73)
 - c++int转char (80)
 - mysqlany_value (79)
 - static函数和普通函数 (84)
 - el-date-picker开始日期早于结束日期 (76)
 - js判断是否是json字符串 (75)
 - c语言min函数头文件 (77)
 - asynccallback (87)
 - localstorage.removeitem (77)
 - vector线程安全吗 (73)
 - java (73)
 - js数组插入 (83)
 - mac安装java (72)
 - 无效的列索引 (74)
 
 
