
引言在开发智能家居控制应用时若不使用类需要为每个设备单独定义变量与功能函数代码繁琐且无法将同一设备的属性与逻辑关联起来。类是面向对象编程的核心容器用于将同一对象的属性特征和方法操作打包在一起作为创建对象的模板实现代码模块化。本节课将系统讲解 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; }使用类封装后的写法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关键字声明类类名首字母大写遵循命名规范类体用{}包裹。类中可定义属性属性名: 类型 属性值和方法方法名 参数 方法体。class Device { name: string ; // 定义属性 // 定义方法 getInfo(): string { return ${this.name}; } }构造函数与类的实例化构造函数规则使用constructor关键字声明构造函数通过new创建实例时自动执行核心作用是初始化实例属性。this指向当前正在创建的实例对象。带参数的构造函数示例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 ; 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关键字的区别特性对象字面量new关键字实例化方式直接通过{}初始化属性无需调用构造函数会调用类的构造函数构造函数执行不执行类中的构造函数逻辑自动执行构造函数中的初始化逻辑类型检查严格性属性必须严格匹配类定义类型、名称一致自动满足类定义无需额外类型标注适用场景轻量级数据模型、无复杂初始化逻辑的简单类需要构造函数逻辑、方法继承的复杂类对象字面量必须包含类中声明的所有必选属性不支持创建包含方法的类实例方法必须通过构造函数初始化。类的属性分类属性类型关键字归属访问方式特点实例属性无每个实例独立拥有实例名.属性名需创建实例后访问静态属性static属于类本身类名.属性名所有实例共享实例无法访问只读属性readonly实例或类赋值后不可修改常与static结合定义类级常量示例代码class Device { name: string 未知设备; // 静态只读属性所有设备共享的品牌信息 static readonly brand: string 智能家居; } // 访问实例属性 let device new Device(); console.log(device.name); // 输出未知设备 device.name 灯; // 实例属性可重新赋值 // 访问静态属性 console.log(Device.brand); // 输出智能家居 Device.brand 其他; // 报错无法修改只读属性 device.brand; // 报错实例不存在 brand 属性类属性与普通变量的区别维度普通变量let/const声明类属性定义位置可在任何作用域声明类内部声明通过修饰符修饰调用方式直接调用通过对象或类名静态属性调用生命周期由作用域决定如函数执行完毕即销毁与类实例同生命周期类的方法方法定义和函数类似但不需要function关键字直接在类内部写方法名、参数、方法体即可。方法类型关键字归属调用方式实例方法无属于实例实例名.方法名()静态方法static属于类类名.方法名()函数不依赖类/对象可独立声明直接调用方法是依附于类的函数必须定义在类内部通过实例或类名调用。面向对象三大核心特征继承作用抽取多个子类的公共属性和方法到父类子类继承后直接复用公共逻辑同时保留自身特有属性方法减少重复代码。语法通过extends关键字实现ArkTS 中类只支持单继承即一个子类只能有一个父类。重要规则如果子类定义了自己的构造函数必须在构造函数中通过super()调用父类的构造函数否则编译器会报错。封装作用将数据和方法封装在类内部通过访问修饰符隐藏内部实现只对外暴露必要的访问接口保证数据的一致性和安全性。修饰符访问范围说明public默认类内部、子类、外部均可访问未加修饰符的属性和方法默认都是publicprivate仅允许在当前类内部访问子类和外部均不可访问用于封装敏感数据或内部逻辑protected允许在当前类内部和子类中访问外部不可访问多态原理基于继承实现子类继承父类后可以重写父类的方法不同子类对同一方法的实现逻辑不同。使用父类类型引用不同子类实例调用方法时会呈现不同的执行结果。方法重写规则子类方法必须与父类方法同名。参数的类型、顺序、数量完全一致。返回值类型与父类相同或为其子类。访问权限不能比父类更严格。抽象类定义通过abstract关键字修饰作为子类的规范模板定义子类必须实现的抽象方法。规则抽象类不能直接实例化。抽象类中既可以定义只有方法签名没有方法体的抽象方法也可以定义已经实现的普通方法。子类继承抽象类后必须实现所有抽象方法否则编译器报错。接口的声明与使用作用接口用于约束类的结构规定类必须包含哪些属性和方法只定义结构规范不提供具体实现。语法通过interface关键字声明。接口中的方法只有方法签名没有方法体属性只有类型没有初始值。核心特性接口支持多继承一个接口可以同时继承多个父接口。类通过implements关键字实现接口一个类可以同时实现多个接口。实现接口时必须实现接口要求的所有属性和方法否则编译器报错。抽象类与接口的核心区别对比维度接口抽象类核心定位专注于结构规范只声明属性和方法不提供实现侧重模板和逻辑复用既可以定义抽象方法也可以提供完整实现继承/实现规则支持多继承、多实现一个类可实现多个接口仅支持单继承一个子类只能继承一个抽象类成员特性所有成员默认公开不支持静态属性和方法支持用访问修饰符控制权限支持静态成员实例化不能直接实例化不能直接实例化总结本节课系统讲解了 ArkTS 中类与接口的核心知识类的声明与实例化通过class关键字声明支持new关键字和对象字面量两种实例化方式。构造函数通过constructor声明自定义构造后默认无参构造失效。类的属性与方法属性分为实例属性、静态属性static和只读属性readonly方法分为实例方法和静态方法均无需function关键字。面向对象三大特征封装通过public/private/protected三种修饰符实现。继承通过extends实现单继承子类自定义构造必须调用super()。多态子类重写父类方法实现差异化行为需遵循方法重写签名规则。抽象类与接口两者均不能直接实例化。抽象类abstract侧重模板和逻辑复用支持单继承接口interface侧重结构规范支持多继承和多实现。