资讯动态

仓颉编程基础及应用:静态成员函数重定义(redef)与静态属性实战指南

发布时间:2026/10/14 17:36:35 来源:尧图企业网站定制
示例工程教程【免费下载链接】仓颉编程基础及应用_陈波_何睿_重庆大学《仓颉编程基础及应用》清华大学出版社2025年9月第1版 1. 随书源代码 2. PPT; 3.在线扩展阅读资料。项目地址https://gitcode.com/Cangjie-SIG/Cangjie_Basics_Application点击查看免费下载本文基于《仓颉编程基础及应用》随书资料中的扩展阅读文档 cjstaticredef.md 与配套源码工程 StaticRedef 编写系统讲解仓颉语言中静态成员函数与静态成员属性的重定义redef机制。读完后你将能够区分 override 与 redef 两种重定义方式、正确地在子类中为父类静态成员函数编写新实现并通过cjpm构建工具独立运行验证相关示例。一、核心概念override 与 redef 的分工在面向对象的继承体系中子类对父类成员进行重新实现时仓颉语言按成员的绑定方式区分了两种术语在子类中对实例成员函数和实例成员属性的重新实现称为重写override对静态成员函数和静态成员属性的重新实现则称为重定义redef。这一区分的底层原因在于静态成员函数没有隐含的this形参其调用由通过哪个类型名访问静态决定而不是由运行时对象类型动态分派。因此子类对静态成员函数的重新实现本质上是为子类类型提供一份同名的独立实现而不是覆盖父类那份实现——这正是文档中称之为重定义而非重写的语义来源。二、静态成员函数的重定义完整示例对于静态函数子类中可以重定义父类中的同名非抽象静态函数即在子类中为父类中的某个静态函数定义新的实现。重定义时要求子类中的同名静态函数使用redef修饰其中redef是可选的。下面是随书资料给出的完整示例其源码与仓库中 StaticRedef/src/main.cj 完全一致package StaticRedef open class Polygon { static func internalAnglesSum() { (3-2)*180 //假设多边形是3条边 } } class Hexagon : Polygon { static redef func internalAnglesSum() { (6-2)*180 //6边形6条边 } } main(): Int64 { println(Polygon.internalAnglesSum()) print(Hexagon.internalAnglesSum()) return 0 }对应源码行号可参见 main.cj#L3-L13。逐行解析如下与原扩展文档的注释保持一致第 3 ~ 7 行Polygon为多边形类。其中internalAnglesSum()为静态成员函数。其假设多边形由三条边组成返回内角和 180 度。第 9 ~ 13 行从Polygon继承定义子类Hexagon六边形。第 10 ~ 12 行重定义redef父类的静态成员函数internalAnglesSum()。其中关键字redef可以省略。第 16 行Polygon.internalAnglesSum()执行的是Polygon类型的静态成员函数返回值为执行结果第 1 行的180。第 17 行Hexagon.internalAnglesSum()执行的是Hexagon类型的静态成员函数返回值为执行结果第 2 行的720。上述程序的执行结果为180 720从执行结果可以直观看出静态绑定的行为两次调用分别通过Polygon和Hexagon两个类型名发起各自命中对应类型上定义的静态成员函数彼此互不干扰。这与实例成员函数依据运行时对象类型进行动态分派的 override 机制形成鲜明对照。另外值得注意的一点是父类Polygon声明为open class——只有开放类才能被继承这是Hexagon得以重定义其静态函数的前提。三、工程结构与运行方式StaticRedef是一个标准的仓颉包工程位于 BookSourceCode/CH8/ 目录下与第八章面向程序设计的其他示例如StaticProp、AccessControl、ZebraFish等并列。其目录结构为src/main.cj示例源码含package StaticRedef包声明与全局main入口cjpm.toml包描述文件cjpm.lock依赖锁定文件。cjpm.toml 中的关键配置[package] cjc-version 0.60.5 name StaticRedef version 1.0.0 output-type executable [dependencies]cjc-version声明编译该包所用的仓颉编译器版本0.60.5name包名需与源码中的package StaticRedef声明对应output-type executable构建产物为可执行程序[dependencies]本示例无外部依赖。运行方式在本仓库根目录下执行仓库为只读资料请勿直接改动建议先将工程复制到本地工作区cd BookSourceCode/CH8/StaticRedef cjpm run预期终端输出为两行数字180与720。整个仓库按仓颉 LTS 1.0.0 标准编写参见 README.md示例代码与该语言版本的redef语义保持一致。四、延伸静态属性的重定义扩展文档在结尾指出静态属性是伪装成静态数据成员的静态成员函数其重定义方法和过程与静态函数类似。要理解这句话可以先看同章的静态属性示例 StaticProp/src/main.cjpackage StaticProp //多边形类 class Polygon { private static var edge 4 //边数 static mut prop edgeCount:Int64 { get() { return edge } set(v) { edge v } } static prop internalAnglesSum:Int64 { get() { (edge - 2) * 180 } //内角和 (边数 - 2) * 180 } } main(): Int64 { println(${Polygon.edgeCount}边形内角和为${Polygon.internalAnglesSum}。) Polygon.edgeCount 6 //修改边数为4 print(${Polygon.edgeCount}边形内角和为${Polygon.internalAnglesSum}。) return 0 }其运行结果为4边形内角和为360。 6边形内角和为720。该示例展示了静态属性的两个基本形态static mut prop edgeCount带mut修饰的静态属性同时提供get与set外观上像静态数据成员实质上每次访问都执行对应的取值/置值函数static prop internalAnglesSum未用mut修饰的静态属性只读其get函数按公式内角和 (边数 − 2) × 180计算返回值。由于静态属性本质上就是静态成员函数取值函数/置值函数因此在子类中重定义静态属性时同样采用redef修饰同名静态属性即可规则与第二节静态函数的重定义完全对称。同时要注意与静态函数相同的使用约束静态成员函数含静态属性的 get/set 函数没有隐含的this形参内部只能访问类型的静态成员变量与静态成员函数不能直接访问实例成员。五、要点小结术语区分实例成员重新实现是 override重写静态成员重新实现是 redef重定义。redef 修饰可选子类中重定义父类同名静态函数时redef关键字可以省略但显式写出更符合文档规范、可读性更好。调用即绑定Polygon.internalAnglesSum()与Hexagon.internalAnglesSum()各自由类型名静态绑定到各自的实现输出180与720不存在基于实例的动态分派。继承前提父类需声明为open才可被继承并重定义其静态成员。静态属性的本质静态属性是伪装成静态数据成员的静态成员函数重定义方式与静态函数类似定义静态属性所在类时还应注意mut决定属性是否可写。参考源码入口StaticRedef 工程、StaticProp 工程、原始扩展文档 cjstaticredef.md。赞分享示例工程教程【免费下载链接】仓颉编程基础及应用_陈波_何睿_重庆大学《仓颉编程基础及应用》清华大学出版社2025年9月第1版 1. 随书源代码 2. PPT; 3.在线扩展阅读资料。项目地址https://gitcode.com/Cangjie-SIG/Cangjie_Basics_Application点击查看免费下载相关推荐免费替换游戏 DLSS DLLDLSS Swapper 三步换版、一键回滚免费替换游戏 DLSS DLLDLSS Swapper 三步换版、一键回滚 DLSS Swapper 是一款免费开源的 Windows 工具负责下载、管理并桌面应用《仓颉编程基础及应用》扩展阅读用 std.convert 的 format 函数掌握仓颉字符串的复杂格式化《仓颉编程基础及应用》扩展阅读用 std.convert 的 format 函数掌握仓颉字符串的复杂格式化 将一个数值对象转换成指定样式的字符串规定宽度、对示例工程教程scrcpy 投屏控制上手指南一条命令镜像安卓手机鼠标键盘直接操作scrcpy 投屏控制上手指南一条命令镜像安卓手机鼠标键盘直接操作 scrcpy 是一款免费的开源投屏工具把安卓手机屏幕实时显示到电脑上让你用鼠标和键盘音视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑