仓颉语言属性(prop)完全指南:getter/setter 定义、抽象属性与继承覆盖实战
文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载属性Properties是仓颉语言中用于间接获取和设置值的语言机制它通过一个 getter 和可选的 setter 对外暴露数据访问接口而调用方使用属性时与使用普通变量无异。本文以仓颉开发者文档 prop.md 为骨架系统讲解属性的定义语法、getter/setter 函数类型语义、mut修饰规则、修饰符体系、抽象属性与覆盖/重定义规则并结合class、struct、enum、扩展与反射等仓库文档给出可直接编译运行的完整示例。读完本文你将能够熟练地在类、接口、结构体、枚举与扩展中定义属性设计出兼具封装性与可读性的数据访问接口。属性是什么用 getter/setter 封装数据访问属性提供了一个 getter 和一个可选的 setter用来间接获取和设置值。使用属性的时候与普通变量无异——你只需要对数据操作对内部的实现无感知。这种间接性带来了四个典型收益访问控制、数据监控、跟踪调试、数据绑定。例如可以在 getter/setter 中插入日志、校验、缓存或通知逻辑而调用方无需感知这些内部细节。属性在使用时可以作为表达式触发 getter或被赋值触发 setter。文档以类和接口为例进行说明但属性不仅限于类和接口还可在struct、enum、extend中定义。下面是一个最典型的属性示例b封装了外部对私有成员a的访问。class Foo { private var a 0 public mut prop b: Int64 { get() { println(get) a } set(value) { println(set) a value } } } main() { var x Foo() let y x.b 1 // get x.b y // set }这里Foo提供了一个名为b的属性针对 getter/setter 两个功能仓颉提供了get和set两种语法来定义当一个类型为Foo的变量x访问b时会调用b的 get 操作返回类型为Int64的值因此可以与1相加当x对b赋值时会调用b的 set 操作将y的值传给 set 的形参value最终将value赋值给a。通过属性b外部对Foo的成员变量a完全不感知却可以通过b做到同样的访问和修改操作实现了有效的封装性。程序输出如下get set属性的定义与语法结构属性可以在interface、class、struct、enum、extend中定义。一个典型的属性语法结构如下class Foo { public prop a: Int64 { get() { 0 } } public mut prop b: Int64 { get() { 0 } set(v) {} } }其中使用prop声明的a和b都是属性类型都是Int64。这里可以提炼出两条强制规则a是无mut修饰符的属性这类属性有且仅有定义 getter对应取值实现b是使用mut修饰的属性这类属性必须分别定义 getter对应取值和 setter对应赋值的实现。注意对于数值、元组、函数、Bool、Unit、Nothing、String、Range和enum类型在它们的扩展和声明中不能声明mut修饰的属性也不能实现带mut属性的接口。也就是说上述这些类型只能承载只读属性。从关键字表见 keyword.md可以看到prop是仓颉的保留关键字不能作为标识符使用属性的声明统一由它引出。getter 与 setter 的函数类型语义属性的 getter 和 setter 分别对应两个不同的函数二者的函数类型是固定的getter 函数类型是() - T其中T是该属性的类型。当使用该属性作为表达式时会执行 getter 函数setter 函数类型是(T) - Unit其中T是该属性的类型形参名需要显式指定。当对该属性赋值时会执行 setter 函数setter 中的形参对应赋值时传入的值。getter 和 setter 的实现中可以像函数体一样包含声明和表达式与函数体的规则一致函数体规则详见 define_functions.md#函数体函数体通常包含变量定义和表达式其类型为最后一项的类型若最后一项为表达式函数体类型即该表达式的类型若最后一项为变量定义或函数声明或函数体为空则类型为Unit。因此getter 的末尾直接写表达式即为其返回值。下面这个示例展示了 setter 形参v如何承接赋值传入的值class Foo { private var j 0 public mut prop i: Int64 { get() { j } set(v) { j v } } }需要注意一个陷阱在属性的 getter 和 setter 中访问属性自身属于递归调用与函数调用一样可能会出现死循环。例如在b的 getter 中写b而不是a会不断触发 getter 自身导致无限递归。正确的做法是在 getter/setter 内部访问真正承载数据的成员变量。属性修饰符访问控制、静态属性与继承覆盖可以在prop前面声明需要的修饰符。属性支持访问修饰符如public、private也支持static、open、override、redef等。访问修饰符和成员函数一样属性可以用public、private等访问修饰符控制可见性class Foo { public prop a: Int64 { get() { 0 } } private prop b: Int64 { get() { 0 } } }open / override / redef在子类型中覆盖与重定义和成员函数一样成员属性也支持open、override、redef修饰因此可以在子类型中覆盖/重定义父类型属性的实现。覆盖规则有一条硬性约束子类型覆盖父类型的属性时如果父类型属性带有mut修饰符则子类型属性也需要带有mut修饰符同时也必须保持一样的类型。如下代码所示A中定义了x和y两个属性B中可以分别对x和y进行override/redefstatic属性使用redef实例属性使用overrideopen class A { private var valueX 0 private static var valueY 0 public open prop x: Int64 { get() { valueX } } public static mut prop y: Int64 { get() { valueY } set(v) { valueY v } } } class B : A { private var valueX2 0 private static var valueY2 0 public override prop x: Int64 { get() { valueX2 } } public static redef mut prop y: Int64 { get() { valueY2 } set(v) { valueY2 v } } }注意父类A需要open修饰才可被继承父类中需要被覆盖的属性用open标记子类中实例属性用override静态属性用redef且mut一致性、类型一致性都必须保持。静态属性属性还分为实例成员属性和静态成员属性。静态属性使用static修饰通过类型名访问其定义、使用规则与class的静态成员变量一致成员变量规则详见 class.md#class-成员变量。抽象属性接口与抽象类的数据操作约定类似于抽象函数在interface和抽象类中也可以声明抽象属性——这些抽象属性没有实现只保留签名interface I { prop a: Int64 } abstract class C { public prop a: Int64 }当实现类型实现interface或者非抽象子类继承抽象类时必须实现这些抽象属性。与覆盖的规则一样如果父类型属性带有mut修饰符则实现类型或子类的属性也需要带有mut修饰符并保持一样的类型interface I { prop a: Int64 mut prop b: Int64 } class C : I { private var value 0 public prop a: Int64 { get() { value } } public mut prop b: Int64 { get() { value } set(v) { value v } } }抽象属性让接口和抽象类对一些数据操作能以更加易用的方式进行约定相比函数的方式更直观。下面是对同一个size值的获取和设置进行约定时属性方式I1与函数方式I2的对比——属性方式代码更少也更符合对数据操作的意图interface I1 { mut prop size: Int64 } interface I2 { func getSize(): Int64 func setSize(value: Int64): Unit } class C : I1 I2 { private var mySize 0 public mut prop size: Int64 { get() { mySize } set(value) { mySize value } } public func getSize() { mySize } public func setSize(value: Int64) { mySize value } } main() { let a: I1 C() a.size 5 println(a.size) let b: I2 C() b.setSize(5) println(b.getSize()) }5 5同样的语义属性方式a.size 5/println(a.size)比函数方式b.setSize(5)/println(b.getSize())更贴近对数据进行操作的意图同时代码量更少。属性的使用实例属性、静态属性与 let/var 语义属性分为实例成员属性和静态成员属性。成员属性的使用方式和成员变量的使用方式一样实例属性通过对象访问静态属性通过类型名访问成员变量访问规则详见 class.md#class-成员变量class A { public prop x: Int64 { get() { 123 } } public static prop y: Int64 { get() { 321 } } } main() { var a A() println(a.x) // 123 println(A.y) // 321 }结果为123 321属性与变量的赋值语义还有以下对应关系无mut修饰符的属性类似let声明的变量不能被赋值。下面的代码中读取x.i合法但x.i 1会编译报错class A { private let value 0 public prop i: Int64 { get() { value } } } main() { var x A() println(x.i) // OK x.i 1 // Error }带有mut修饰符的属性类似var声明的变量可以取值也可以被赋值class A { private var value: Int64 0 public mut prop i: Int64 { get() { value } set(v) { value v } } } main() { var x A() println(x.i) // OK x.i 1 // OK }0属性的更多落地场景扩展、结构体、枚举与反射属性在仓颉各类型体系中均可使用以下场景可以帮你把属性用到更广阔的地方1. 扩展中定义属性extend。扩展可以为当前package中可见的类型除函数、元组、接口添加成员属性适合在不破坏被扩展类型封装性的前提下补充数据访问能力详见 extend_overview.md。例如extend Boo { public prop x: Int64 { // 添加成员属性 get() { 123 } } }不过扩展受限较多扩展不能增加成员变量、扩展的属性和函数必须拥有实现、扩展的属性不能用open/override/redef修饰也不能访问被扩展类型中private修饰的成员。2. struct 与 enum 中的属性。struct的定义体中可声明成员变量、成员属性等详见 define_struct.mdenum体中同样可以定义成员属性但要求构造器、成员函数、成员属性之间不能重名详见 enum.md。3. 通过反射检查与修改属性。仓颉的反射机制支持对属性进行检查与修改TypeInfo的子类ClassTypeInfo提供接口访问类公开的成员变量、属性与函数instanceProperties可列出实例成员属性getInstanceProperty获取属性信息isMutable判断属性是否可写详见 dynamic_feature.md。例如反射输出的属性描述形式为[prop p1: Int64, mut prop p2: Int64]其中mut前缀即标识可写属性——这与编译期属性声明的mut语义完全一致。4. 跨平台common/specific场景中的属性限制。在多平台开发中common属性可以有具体实现也可以仅保留属性签名交由specific属性实现若common属性有完整实现则可省略specific属性common与specific属性的类型、可见性和可赋值性必须相同common/specific的interface属性中若common属性包含具体实现则specific属性必须也包含具体实现详见 common_platform.md。小结仓颉的属性机制围绕prop关键字展开核心要点可以归纳为维度规则要点定义位置interface、class、struct、enum、extendgetter函数类型() - T属性作表达式时执行无mut属性必须且只能定义 gettersetter函数类型(T) - Unit形参名需显式指定mut属性必须同时定义 getter 与 settermut限制数值、元组、函数、Bool、Unit、Nothing、String、Range、enum类型不能声明/实现mut属性修饰符public/private等访问修饰、static、open/override/redef覆盖时mut与类型必须一致抽象属性在interface与抽象类中声明实现类型/非抽象子类必须实现使用语义无mut属性 ≈let变量只读mut属性 ≈var变量可读可写递归陷阱在 getter/setter 中访问属性自身会递归调用可能导致死循环属性把数据访问从具体存储中解放出来让访问控制、数据监控、跟踪调试与数据绑定有了自然的实现位置是仓颉面向对象编程中兼具封装性与表达力的核心语言特性。赞分享文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载相关推荐wasm-bindgen 属性指南用 getter 与 setter 在 Rust 中定义 JavaScript 类属性wasm bindgen 属性指南用 getter 与 setter 在 Rust 中定义 JavaScript 类属性 本文是 wasm bindgen 属开发工具htmx hx-disinherit 属性完全指南精确控制属性继承与局部覆盖htmx hx disinherit 属性完全指南精确控制属性继承与局部覆盖 htmx 默认会把父元素上的许多属性自动继承给子元素例如在父节点设置 hx前端Web框架Yii 2 属性机制完全指南基于 getter/setter 的魔术属性定义与源码原理Yii 2 属性机制完全指南基于 getter/setter 的魔术属性定义与源码原理 本指南以 Yii 2 框架文档《プロパティ》docs/guide j后端Web框架上一篇颠覆式缠论可视化通达信Indicator插件革新技术分析范式下一篇轻量级高效解决方案JPEGView的图像查看与编辑全功能工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从Node到Bun:JavaScript运行时与工具链的工程效率革命

从Node到Bun:JavaScript运行时与工具链的工程效率革命

1. 为什么我把重心从 Node 切到了 Bun先说结论:Bun 不是又一个跑得更快的 Node,它是一整套重新设计过的 JavaScript 运行时和工具链。我最初对它的态度是观望,因为这类"下一代运行时"的宣发见过太多次了,但真正在几个中…

2026/10/14 6:40:29 阅读更多 →
C#对接WebService拉取PDF并转图片:从接口调到部署避坑

C#对接WebService拉取PDF并转图片:从接口调到部署避坑

前一阵接手一个对接任务,对方是个运行了十多年的老系统,只对外暴露SOAP风格的WebService接口。业务要求很直接:通过这个接口把PDF文件拉到我们这边,再转成图片,放到Web端做在线预览和打印存档。这类需求在C#开发里非常…

2026/10/14 6:40:29 阅读更多 →
纯Python实现猜数字游戏:从零到避坑的完整指南

纯Python实现猜数字游戏:从零到避坑的完整指南

猜数字游戏大概是很多人的第一个编程项目。它不像计算器那样枯燥,也不需要复杂的界面,但一套完整流程走下来,变量、输入输出、条件判断、循环、异常处理这些编程入门核心概念全部能练到。我最近又把这个小项目从头写了一遍,用最基…

2026/10/14 6:39:29 阅读更多 →

最新新闻

CangjieMagic jsonable 包深入解析:声明式 JSON 序列化、类型模式与语义约束校验

CangjieMagic jsonable 包深入解析:声明式 JSON 序列化、类型模式与语义约束校验

人工智能大模型AI AgentRAG工具调用MCP 服务MCP Clients多智能体 【免费下载链接】CangjieMagic 基于仓颉编程语言构建的 LLM Agent DSL,其主要特点包括:声明式 DSL、支持 MCP 协议,支持任务智能规划等。 项目地址: https://gitco…

2026/10/14 7:21:37 阅读更多 →
杭州装修暖通系统选择指南:避坑与实用技巧

杭州装修暖通系统选择指南:避坑与实用技巧

1. 装修小白必看:暖通选择为何如此重要在杭州装修过房子的朋友都知道,暖通系统是整个装修过程中最容易踩坑的环节之一。我从业内朋友那里听到过太多血泪史:有人花了大价钱装的地暖冬天不热,有人装的中央空调夏天制冷效果差&#x…

2026/10/14 7:21:37 阅读更多 →
商标权的利用

商标权的利用

商标权的利用商标权的利用是商标法中的一项重要制度,深刻体现了商标权的私权属性。探讨商标权如何在法律框架内实现其经济价值与法律功能。注册商标使用的法律界定与“连续三年不使用撤销制度”;商标权许可的三种类型及其质量控制义务;商标权…

2026/10/14 7:21:37 阅读更多 →
OpenLayers等值线编辑实战:从交互组合到数据导出

OpenLayers等值线编辑实战:从交互组合到数据导出

最近做一个气象灾害可视化项目时,我遇到了一个很典型的需求:后端用插值算法自动生成的等值线,并不能直接上线,业务专家必须手动修正那些不合理弯曲、局部小圈和多线粘连。这一步就落在 openlayers 等值线编辑上。简单说&#xff0…

2026/10/14 7:21:37 阅读更多 →
MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →