网站首页 > 技术文章 正文
接口的本质
- 抽象行为约束:接口定义抽象类型,不含数据,仅声明行为(方法、操作符重载、属性)。
- 实现要求:类型实现接口时,必须提供接口中所有成员的具体实现。
- 子类型关系:实现接口的类型自动成为接口的子类型(可向上转型)。
接口定义
接口使用关键字 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):数字时代的重要信任基石
- 08-02C|在一个结构体嵌套一个共用体实现一体多用
- 08-02C++中,常用的强制类型转换函数
- 08-02如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 08-02C++20 新特性(24):模板访问权限和typename的放宽
- 08-02C++零基础到工程实践
- 08-02[深度学习] Python人脸识别库face_recognition使用教程
- 08-02AI算法之怎么利用Python实现支持向量机SVM算法
- 08-02【机器学习】SVM支持向量机
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 623℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 526℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 491℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 460℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)