ArkTS 类与接口概念详解

发布时间:2026/7/23 14:50:38

ArkTS 类与接口概念详解
在 ArkTS 中类与接口的相关知识是面向对象编程的核心内容。也是后续开发的重要基础。类的声明和使用引入不妨把类理解成一个模板用这个模板可以快速创建出具有相同特征和功能的对象。不妨设想一个实际开发场景。要开发一个控制智能设备的应用需要管理智能灯、空调、智能锁等设备。如果只用基础变量实现就需要给每一个设备的每一项信息、每一个功能单独定义。例如灯光控制就需要单独定义灯光名称、灯光亮度等变量还需要一个控制灯光亮度的函数。这样写不仅极其繁琐还无法直接与设备关联起来。let name 灯; let brightness 59; let status off; let location ; function setBrightness(brightnessParam: number) { brightness brightnessParam; } function setStatus(statusParam: string) { status statusParam; } function setLocation(locationParam: string) { location locationParam; }这时候就需要一个容器将同一个设备的信息和功能打包在一起例如用一个对象包含灯的名称、亮度以及调节亮度的方法。在 ArkTS 中这种容器就被称为类。class Light { name 灯; brightness 59; status off; location ; setBrightness(brightnessParam: number) { this.brightness brightnessParam; } setStatus(statusParam: string) { this.status statusParam; } setLocation(locationParam: string) { this.location locationParam; } }声明类是面向对象编程的核心载体用于封装数据属性和行为方法是创建对象的模板。通过 class 声明类结构再用 new 关键字创建类的实例对象实现数据与逻辑的模块化组织。语法规则使用 class 关键字类名首字母大写遵循命名规范声明类类体用 {} 包裹。class类名{属性名:类型属性值方法名() {}}class Device { name: string ; // 定义属性 // 定义方法 getInfo(): string { return ${this.name}; } }构造函数与类的实例化构造函数用 constructor 声明实例创建时自动执行用于初始化实例属性。通过 this 可以访问实例的属性和方法。通过 new() 类名创建类的实例。class Device { name: string ; type: string light; location: string bedroom; constructor(name: string, type: string, location: string) { this.name name; this.type type; this.location location; } } let device: Device new Device(客厅空调, 空调, 客厅); // 传入参数实例化如果没有显式定义构造函数ArkTS 会自动生成一个默认构造函数会使用字段类型的默认值初始化属性。class Device { name: string 客厅空调; } let device: Device new Device();一旦在类中定义了任意自定义构造函数无论是否有参数编译器都会停止生成默认构造函数。class Device { name: string ; constructor(name: string) { this.name name; } } let device: Device new Device(); // 报错预期有 1 个参数但实际未提供任何参数对象字面量创建类的实例除了使用 new 关键字进行类的实例化也可以通过对象字面量定义类实例。对象字面量通过花括号 {} 包裹键值对快速初始化类实例。对象字面量必须包含类中声明的所有必选属性。不支持对象字面量创建带方法的对象。class Device { name: string ; } // 方式一new关键字创建实例 let device1 new Device(); // 方式二通过对象字面量创建实例 let device2: Device { name: 智能手表 };特性对象字面量new 关键字实例化方式直接通过 {} 初始化属性无需调用构造函数会调用类的构造函数构造函数执行不执行类中的构造函数逻辑自动执行构造函数中的初始化逻辑类型检查严格性属性必须严格匹配类定义类型、名称一致自动满足类定义无需额外类型标注适用场景轻量级数据模型、无复杂初始化逻辑的简单类需要构造函数逻辑、方法继承的复杂类属性类属性是面向对象编程的核心组成部分用于描述对象的特征。属性说明实例属性实例属性是每个实例独立拥有的属性。静态属性通过 static 关键字声明访问方式为类名属性名。只读属性只读属性通过 readonly 关键字声明赋值后不可修改。实例属性和静态属性的区别很明显静态属性前面会加 static 关键字实例属性没有。访问的时候实例属性必须先创建类的实例再通过实例名.属性名访问而静态属性不用创建实例直接通过类名.属性名访问。静态属性是属于类本身的不是属于某个实例的所以创建出来的实例是访问不到静态属性的。class Device { name: string 未知设备; // 静态属性所有设备共享的品牌信息 static brand: string 智能家居; } // 访问实例属性实例名.属性名 let light new Device(); console.log(light.name); // 输出: 未知设备 // 访问静态属性类名.属性名无需实例化 console.log(Device.brand); // 输出智能家居 // 静态属性不归属实例实例无法访问 let device new Device(); console.log(device.brand) // 报错实例不存在 brand 属性只读属性是用 readonly 这个关键字声明的也就是说这个属性只能在创建实例时赋值之后就无法修改了。在实际开发中readonly 常常和 static 一起用。用来定义一些固定不变的类级别的属性。class Device { name: string 未知设备; // 静态属性所有设备共享的品牌信息 static readonly brand: string 智能家居; } let device new Device(); console.log(device.name); // 未知设备 device.name 灯; // 实例属性可重新赋值 console.log(device.name); // 灯 console.log(Device.brand); // 输出智能家居 Device.brand 其他; // 无法分配给 brand因为它是只读属性维度变量类属性定义位置可在任何作用域通过 let/const 关键字声明类内部声明通过修饰符修饰调用方式直接调用通过对象或类名静态方法调用生命周期由作用域决定如函数执行完毕即销毁与类实例同生命周期方法类的方法是面向对象编程的核心组成部分用于封装对象的行为和操作。实例方法是类中定义的普通方法。需通过实例调用可通过 this 访问实例属性。静态方法通过 static 关键字声明归属类而非实例无需实例化即可调用。class Device { name: string 未知设备; // 实例方法获取设备完整信息 getInfo(): string { return 设备名称是${this.name}; } // 静态方法验证设备名称是否合法工具类逻辑 static isValidName(name: string): boolean { return name.trim().length 0; } } let light new Device(); light.name 客厅主灯; // 调用实例方法实例名.方法名() console.log(light.getInfo()); // 输出客厅主灯 (类型light) // 调用静态方法类名.方法名() console.log(${Device.isValidName(客厅主灯)}); // 输出true维度函数方法定义位置全局/模板作用域通过 function 关键字声明类内部调用方式直接调用通过对象或类名静态方法调用访问实例数据无通过 this 访问继承还是回到智能家居控制应用的开发场景假设我们现在已经定义了两个类一个是控制灯光的 Light 类一个是控制空调的 AirConditioner 类。class Light { name 灯; status off; location ; brightness 59; setStatus(statusParam: string) { this.status statusParam; } setLocation(locationParam: string) { this.location locationParam; } setBrightness(brightnessParam: number) { this.brightness brightnessParam; } } class AirConditioner { name 空调; status off; location ; temperature: number 26; setStatus(statusParam: string) { this.status statusParam; } setLocation(locationParam: string) { this.location locationParam; } setTemperature(temp: number): void { this.temperature temp; } }不难发现这两个类中有很多重复内容例如都有设备名称、开关状态。这些共性属性也都有设置状态而且后续还要添加更多设备。如果每新增一个设备就要重写一个类把这些共性的内容再写一遍就会有大量重复工作项目中也会出现大量重复代码既麻烦又容易出错。因此可以考虑将这些共性的属性和方法统一抽取到一个公共类里只需要保证 Light 类既可以直接用这个公共类里面的公共属性和方法又能保留自己特有的属性和方法即可。定义一个包含公共属性和方法的 Device 类再定义 Light 类继承 Device 类。继承使用 extends 关键字并且只能单继承即一个类只能有一个父类。通过继承后Light 类就继承了 Device 类中的属性和方法。加上自己定义的亮度属性和设置亮度的方法就和之前定义的 Light 类是一样的了。class Device { name ; status off; location ; setStatus(statusParam: string) { this.status statusParam; } setLocation(locationParam: string) { this.location locationParam; } } class Light extends Device { brightness 59; setBrightness(brightnessParam: number) { this.brightness brightnessParam; } }super 是子类访问父类构造函数、方法和属性实现继承逻辑复用的方法。构造函数规则子类构造函数中必须首先通过 super() 调用父类构造函数且必须在访问 this 之前进行。class Device { name: string; constructor(name: string) { this.name name; } } // 子类继承 Device class Light extends Device { brightness: number 50; constructor(name: string, brightness: number) { super(name); // 调用父类构造函数 this.brightness brightness; } setBrightness(value: number): void { this.brightness value; console.log(${this.name}亮度设置为: ${value}%); } } let light: Light new Light(客厅灯, 50); light.setBrightness(100);封装类的封装是实现代码复用、逻辑内聚和数据安全的核心技术。通过访问修饰符private、protected、public)限制属性和方法的可见性。若未明确指定修饰符ArkTS 默认成员为 public。修饰符可见范围适用场景public全局可见类内部、子类、外部均可访问公共接口、跨模块调用private仅类内部子类、外部均禁止封装敏感数据或内部逻辑protected类及子类同一模块内允许子类继承并扩展父类功能class Device { // public 可省略默认 public name: string; private id: string 1’; protected status: string off; constructor(name: string) { this.name name; } } let light new Device(客厅灯); console.log(light.name); // 外部可访问输出客厅灯 console.log(light.id); // 报错属性id是私有的只能在Device类内部访问 console.log(light.status); // 报错属性status是私有的只能在Device类内部访问不妨看看下面这个示例。这里创建了一个 Light 类通过 extends 继承 Device 类并在 Light 类中实现了一个设置亮度的方法。在这个方法中可以访问 name 属性和被 protected 修饰的 status 属性这些在 Light 类内部是可以正常访问的。但如果试图在子类访问父类的私有属性时编译器会提示错误信息属性 id 是私有的只能在 Device 类内部访问。创建 Light 的实例后通过这个实例也能访问到父类定义的 name 属性和公共方法。不过通过 Light 实例访问 status 属性是行不通的因为 status 是被 protected 修饰的只能在父类内部和子类内部访问类外部不能访问。class Device { // public 可省略默认 public name: string; private id: string 1’; protected status: string off; constructor(name: string) { this.name name; } } // 子类继承 Device class Light extends Device { private brightness: number 50; constructor(name: string) { super(name); } setBrightness(value: number): void { if (this.status on) { this.brightness value; console.log(${this.name}开关状态为${this.status}亮度设置为${value}); } else { console.log(${this.name}开关状态为${this.status}未开启无法设置亮度); } } public getInfo(): string { // return ${this.name} 设备id为${this.id}; // 属性id是私有的只能在Device类内部访问。 } } let light new Light(客厅灯); console.log(light.name); // 打印客厅灯 light.setBrightness(50) // 打印客厅灯开关状态为off未开启无法设置亮度 // console.log(light.status); // 报错类型Light上不存在属性status。多态类的多态是指同一行为方法在不同对象上有不同表现。子类继承父类并可以重写父类方法。不同的子类对父类方法的重写逻辑不一样。通过统一的父类接口调用时会呈现出不同的效果。方法重写时要求子类方法与父类方法同名且参数类型顺序及数量完全一致返回值要与父类相同或者是其子类型并且访问权限不能缩小。class Device { public name: string; protected status: string off; constructor(name: string) { this.name name; } // 父类统一方法子类可重写 turnOn(): void { console.log(${this.name}状态为${this.status}); } } // 灯光设备 class Light extends Device { private brightness: number 50; turnOn(): void { this.status on; console.log(${this.name}状态为${this.status}亮度为${this.brightness}); } } // 空调设备 class AirConditioner extends Device { private temperature: number 26; turnOn(): void { this.status on; console.log(${this.name}状态为${this.status}设置的温度是${this.temperature}); } } let light: Device new Light(客厅灯); light.turnOn(); // 输出客厅灯状态为 on亮度为 50 let airConditioner: Device new AirConditioner(空调); airConditioner.turnOn(); // 输出空调状态为 on设置的温度是 26抽象类抽象类通过 abstract class 声明是无法直接实例化的“规范类”作为父类被子类继承并实现抽象方法。用于定义子类必须遵循的接口标准。abstract class Device { public name: string ; protected abstract status: string; // 抽象方法仅声明无方法体强制子类实现 abstract turnOn(): void; // 普通方法子类可直接复用 getStatus(): string { return ${this.name} is ${this.status}; } } // 子类没有实现父类中的抽象变量或抽象方法 class Light extends Device { // 非抽象类Light没有实现从类Device继承的抽象成员status。 // 非抽象类Light没有实现从类Device继承的抽象成员turnOn。 } // 子类实现抽象类 class Light extends Device { protected status: string ; // 必须实现抽象方法 turnOn turnOn(): void { this.status on; console.log(${this.name} 灯光开启); } }接口的声明和使用声明接口的作用是约束类的属性和方法结构。接口通过 interface 关键字声明描述对象应具备的属性和方法。interface接口名称{属性名:类型方法名:返回值类型}interface Switchable { deviceName: string; // 设备名称必填属性 turnOn(): void; // 打开设备必填方法 turnOff(): void; // 关闭设备必填方法 }继承接口通过 extends 关键字继承其它接口一个接口可以继承多个父接口。interface Switchable { deviceName: string; // 设备名称必填属性 turnOn(): void; // 打开设备必填方法 turnOff(): void; // 关闭设备必填方法 } // 1. 基础设备信息接口约束设备必须包含的基础属性 interface DeviceBase { name: string; // 设备名称 status: string; // 设备状态 deviceType: string; // 设备类型 } // 2. 设备控制接口约束设备必须实现的开关功能 interface DeviceController { turnOn(): void; // 开启设备 turnOff(): void; // 关闭设备 getStatus(): string; // 获取设备状态 } // 新接口继承 DeviceBase 和 DeviceController组合两者的约束 interface IDevice extends DeviceBase, DeviceController{ // 接口通过 extends 继承接口 location: string; // 新增约束设备位置 }类继承接口class AirConditioner implements DeviceBase, DeviceController { name: string ; status: string ; type: string ; constructor(name: string, status: string, type: string) { this.name name; this.status status; this.type type; } turnOn(): void { this.status on; } turnOff(): void { this.status off; } getStatus(): string { return ${this.name} 的状态为 ${this.status}; } } let airConditioner new AirConditioner(空调, on, AirConditioner);类实现接口类需要通过 implements 实现接口并完成所有成员的具体实现。class AirConditioner implements DeviceBase, DeviceController { name: string ; status: string ; type: string ; constructor(name: string, status: string, type: string) { this.name name; this.status status; this.type type; } turnOn(): void { this.status on; } turnOff(): void { this.status off; } getStatus(): string { return ${this.name} 的状态为 ${this.status}; } } let airConditioner new AirConditioner(空调, on, AirConditioner);与抽象类的区别interface IDevice { name: string; turnOn(): void; } class Light implements IDevice { name: string ; turnOn(): void { } } abstract class Device { public name: string ; protected abstract status: string; // 抽象方法仅声明无方法体强制子类实现 abstract turnOn(): void; // 普通方法子类可直接复用 getStatus(): string { return ${this.name} is ${this.status}; } } class Light extends Device { protected status: string ; turnOn(): void { } }特性接口Interface抽象类Abstract Class核心作用定义结构契约强制类遵循统一规范定义基类模板提供部分实现并约束子类成员类型仅含属性声明、方法声明可含属性、普通方法有实现、抽象方法继承/实现类可实现多个接口多实现类只能继承一个抽象类单继承静态成员不支持静态属性/方法支持静态属性/方法访问修饰符成员默认 public不可显示添加其他修饰符支持 public/private/protected 修饰符

相关新闻

TI TLV320AIC音频Codec实战:AGC、DRC与蜂鸣器配置详解

TI TLV320AIC音频Codec实战:AGC、DRC与蜂鸣器配置详解

2026/7/23 14:50:38

1. 项目概述与核心价值在嵌入式音频系统开发中,处理动态变化的音频信号一直是个头疼的问题。想象一下,你在做一个对讲机或者录音笔,说话的人一会儿离麦克风很近,声音震耳欲聋,一会儿又走远了,声音细若蚊蝇。…

小米6 NAS是什么?旧手机改造私有云优缺点、真实体验与适用人群

小米6 NAS是什么?旧手机改造私有云优缺点、真实体验与适用人群

2026/7/23 14:50:38

在NAS玩机圈子里,除了绿联、群晖、威联通这些成品设备,一直有一个超高热度的零成本DIY方案:小米6 NAS。 很多新手会疑惑:小米6不是多年前的旧旗舰手机吗,怎么能当NAS用? 其实小米6 NAS并不是小米官方产品&a…

JNPF 数据加密

JNPF 数据加密

2026/7/23 14:50:38

数据加密 一、核心功能 数据加密是 JNPF 框架提供的统一加密系统,支持多种加密算法,包括对称加密和非对称加密。 1.1 核心价值 多种加密算法:支持 AES、DES、RSA、SHA、MD5、PBKDF2 等多种加密算法统一接口:提供统一的加密接口&am…

从CAD线稿到沉浸式VR漫游只需11分钟:基于Blender+ControlNet的端到端AI可视化流水线(含Python自动化脚本)

从CAD线稿到沉浸式VR漫游只需11分钟:基于Blender+ControlNet的端到端AI可视化流水线(含Python自动化脚本)

2026/7/23 15:50:41

更多请点击: https://kaifayun.com 第一章:从CAD线稿到沉浸式VR漫游只需11分钟:基于BlenderControlNet的端到端AI可视化流水线(含Python自动化脚本) 传统建筑可视化流程中,CAD线稿需经手动建模、材质赋予、…

在制品WIP管控与生产流转数字化

在制品WIP管控与生产流转数字化

2026/7/23 15:50:41

中小离散制造企业的在制品(WIP)库存周转天数通常在15-25天之间,是流动资金占用的主要来源之一。据蜂巢MOM制造运营管理系统在30余家离散制造企业的实施统计,通过MES(制造执行系统,Manufacturing Execution …

二手应用材料 AMAT/APPLIED MATERIALS 0190-70399 晶圆搬运机技术规格详解

二手应用材料 AMAT/APPLIED MATERIALS 0190-70399 晶圆搬运机技术规格详解

2026/7/23 15:50:41

0190-70399 属于 APPLIED MATERIALS(AMAT)平台配套 Wafer Handler 晶圆搬运模组,适配 Centura 系列真空工艺腔体,支持 200mm 硅晶圆传输,采用真空吸附式 Wafer Blade 取片结构。设备搭载多轴伺服驱动系统,R…

全国保健品展会推荐与甄别:AI智慧健康展的选择标准和口碑参考

全国保健品展会推荐与甄别:AI智慧健康展的选择标准和口碑参考

2026/7/23 15:50:41

健康消费从小众专业领域加速迈向全民生活刚需,保健品与营养健康产业正迎来产品形态、渠道模型与科技赋能的深度重塑。参展不仅是展示,更是获取趋势、对接资源、验证商业路径的关键一步。面对种类繁多的展会,选对平台至关重要。本文基于展会专…

第四步,通过自定义 Converter 进行序列化和反序列化

第四步,通过自定义 Converter 进行序列化和反序列化

2026/7/23 15:50:41

第四步,通过自定义 Converter 进行序列化和反序列化 在软件开发中,序列化和反序列化是数据交换的核心环节。无论是将对象存储到文件、通过网络传输,还是与数据库交互,我们都需要一种机制来将内存中的对象转换为字节流(…

GLM-5.1开源大模型:长程任务处理与自主Agent架构解析

GLM-5.1开源大模型:长程任务处理与自主Agent架构解析

2026/7/23 15:40:40

1. 项目背景与核心价值 蓝耘元生代云MaaS平台最新上线的GLM-5.1模型,标志着开源大模型在长程任务处理能力上的重大突破。这个8小时自主Agent架构的发布,本质上解决了传统开源模型在复杂任务链式调用中的三大痛点:任务记忆碎片化、多步骤逻辑断…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击: https://kaifayun.com 第一章:企业级AI搜索落地选型实战手册(含LLMRAGHybrid架构对比矩阵与ROI测算模板) 企业级AI搜索系统落地成败,核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,深入理解并熟练配置芯片的片上外设,是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文,近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…