ArkTS-类Q为什么需要类A当开发场景中需要定义多个相互之间有关联的变量和方法时需要一个容器将这些东西打包起来从而方便管理和调用。类的声明和使用类是面向对象编程的核心载体用于封装数据属性和行为方法是创建对象的模板。通过class声明类结构再用new关键字创建类的实例对象实现数据与逻辑的模块化组织。class类名首字母大写遵循命名规范{属性名 类型属性值;方法名 {//... }}构造函数和类的实例化构造函数用constructor声明实例创建时自动执行用于** **。通过this可以访问实例的属性和方法。类的实例化通过new 类名()创建类的实例。classDevice{name:string;type:stringlight;location:stringbedroom;constructor(name:string,type:string,location:string){this.namename;this.typetype;this.locationlocation;}}letdevice:DevicenewDevice(客厅空调,空调,客厅);//传入参数实例化需要注意以下两点若未显式定义构造函数ArkTS会自动生成一个默认的构造函数会使用字段类型的默认初始化属性。一旦在类中定义了任意自定义构造函数无论是否有参数编译器就会停止生成默认构造函数。对象字面创建类的实例除了使用new关键字进行类的实例化也可以通过对象字面量定义类实例。对象字面量通过花括号{}包裹键值对快速初始化实例。对象字面量必须包含类中声明的所有必选属性。不支持对象字面量创建带方法的对象classDevice{name:string;}//通过对象字面量创建实例letDevice1:Device{name:智能手表}对象字面量与new关键字实例化类的区别对象字面量new关键字实例化方式直接通过{}初始化属性无需构造函数会调用类的构造函数构造函数执行不执行类中的构造函数逻辑自动执行构造函数中的初始化逻辑类型检查严格性属性必须严格匹配类定义类型、名称一致自动满足类定义无需额外类型标注适用场景轻量级数据模型、无复杂初始化逻辑的简单类需要构造函数逻辑、方法继承的复杂类类的属性类属性是面向对象编程的核心组成部分用于描述对象的特征。xxxxxxxxxx function printInfo(value: string): void;fucntion printInfo(value: number): void;function printInfo(value: string | number): void { if (typeof value ‘string’) { //typeof 返回后方变量的类型 console.log(‘文字信息’, value); } else { console.log(‘数字信息’, value); }}javascript静态属性通过static关键字声明访问方式为类名.属性名只读属性只读属性通过readonly关键字声明赋值后不可修改一般和静态属性一起使用属性与变量的区别变量类属性定义位置可在仍和作用域通过let/const关键字声明类内部声明通过修饰符修饰调用方式直接调用通过对象或类名静态方法调用生命周期由作用域决定如函数执行完毕即销毁与类实例同生命周期classDevice{name:string;}struct Example{letname:string智能电视letDevice1:Device{name:智能手表};console.log(变量值${name});console.log(类属性值${Device1.name});}类的方法类的方法是面向对象编程的核心组成部分用于封装对象的行为和操作。实例方法是类中定义的普通方法。需通过实例调用可通过this访问实例属性静态方法通过static关键字声明归属类而非实例无需实例化即可调用classDevice{name:string未知设备;//实例方法获取设备完整信息getInfo():string{return${this.name};}//静态方法验证设备名称是否合法staticisValidName(name:string):boolean{returnname.trim(),length0;}}letlightnewDevice();light.name客厅主灯;console.log(light.getInfo());//输出客厅主灯类型lightconsole.log(${Device.isValidBName(客厅主灯)});//输出true方法与函数的区别函数方法定义位置全局/模块作用域通过function关键字声明类内部调用方式直接调用通过对象或类名静态方法调用访问实例数据无通过this访问面向对象三大特征继承Q为什么需要继承A当在开发场景中遇到两个对应不同对象的类中具有很多的重复内容比如共性属性共性方法并且后续还要继续增加这种对象类。为了避免大量进行这种重复的工作我们将这些共性属性和方法统一抽取到一个公共类中再由不同的对象继承该公共类使其能够直接使用这些公共属性和方法的同时也能保留自己特有的属性和方法。super是子类访问父类构造函数、方法和属性实现继承逻辑复用语法。构造函数规则子类构造函数中必须首先通过super()调用父类构造函数且必须在访问this之前执行。classDevice{name:string;constructor(name:string){this.namename;}}classLightextendsDevice{brightness:number50;constructor(name:string,brightness:number){super(name);//内部调用superthis.brightnessbrightness;}setBrightness(value:number):void{this.brightnessvalue;console.log(${this,name}亮度设置为${value}%);}}letlight:LightnewLight(客厅灯,50);//lighr 50light.setBrightness(100);//light 100一个子类只能继承一个父类。继承后子类可以调用父类的方法和属性。封装类的封装是实现代码复用、逻辑内聚和数据安全的核心计数。通过访问修饰符private、protected、public限制属性和方法的可见性。若未明确指定修饰符ArkTS默认成员为public。可见范围适用场景public全局可见类内部、子类、外部均可访问公共接口。跨模块调用private仅类内部子类、外部均禁止封装敏感数据或内部逻辑protected类及子类同一模块内允许子类继承并扩展父类功能多态类的多态是同一行为方法在不同对象上有不同的实现。子类继承父类并且可以重写父类方法。classDevice{publicname:string;protectedstatus:stringoff;constructor(name:string){this.namename;}//父类统一方法子类可重写turnOn():void{console.log(${this.name}状态为${this.status});}}//灯光设备classLightextendsDevice{privatebrightness:number50;turnOn():void{this.status-on;console.log(${this.name}状态为${this.status},亮度为${this.status})}}//空调设备classAirConditionerextendsDevice{privatetemperature:number26;turnOn():void{this.status-on;console.log(${this.name}状态为${this.status},亮度为${this.status})}}抽象类抽象类通过abstract class声明是无法直接实例化的“规范类”作为父类被子类继承并实现抽象方法。用于定义子类必须遵循的接口标准。classDevice{publicname:string;protectedabstract status:stringoff;//抽象方法仅声明无方法体强制子类实现abstractturnOn():void;//普通方法子类可直接复用getStatus():string{return${this.name}状态为${this.status};}}classLightextendsDevice{//非抽象类Light没有实现从Device继承的抽象成员status.//非抽象类Light没有实现从Device继承的抽象成员turnOn.}需要注意以下几点非抽象子类继承抽象类时必须实现父类全部抽象方法若子类也声明为抽象类则可以暂不实现构造函数是不能加abstract的要么默认不写要么具体实现
ArkTS-类
ArkTS-类Q为什么需要类A当开发场景中需要定义多个相互之间有关联的变量和方法时需要一个容器将这些东西打包起来从而方便管理和调用。类的声明和使用类是面向对象编程的核心载体用于封装数据属性和行为方法是创建对象的模板。通过class声明类结构再用new关键字创建类的实例对象实现数据与逻辑的模块化组织。class类名首字母大写遵循命名规范{属性名 类型属性值;方法名 {//... }}构造函数和类的实例化构造函数用constructor声明实例创建时自动执行用于** **。通过this可以访问实例的属性和方法。类的实例化通过new 类名()创建类的实例。classDevice{name:string;type:stringlight;location:stringbedroom;constructor(name:string,type:string,location:string){this.namename;this.typetype;this.locationlocation;}}letdevice:DevicenewDevice(客厅空调,空调,客厅);//传入参数实例化需要注意以下两点若未显式定义构造函数ArkTS会自动生成一个默认的构造函数会使用字段类型的默认初始化属性。一旦在类中定义了任意自定义构造函数无论是否有参数编译器就会停止生成默认构造函数。对象字面创建类的实例除了使用new关键字进行类的实例化也可以通过对象字面量定义类实例。对象字面量通过花括号{}包裹键值对快速初始化实例。对象字面量必须包含类中声明的所有必选属性。不支持对象字面量创建带方法的对象classDevice{name:string;}//通过对象字面量创建实例letDevice1:Device{name:智能手表}对象字面量与new关键字实例化类的区别对象字面量new关键字实例化方式直接通过{}初始化属性无需构造函数会调用类的构造函数构造函数执行不执行类中的构造函数逻辑自动执行构造函数中的初始化逻辑类型检查严格性属性必须严格匹配类定义类型、名称一致自动满足类定义无需额外类型标注适用场景轻量级数据模型、无复杂初始化逻辑的简单类需要构造函数逻辑、方法继承的复杂类类的属性类属性是面向对象编程的核心组成部分用于描述对象的特征。xxxxxxxxxx function printInfo(value: string): void;fucntion printInfo(value: number): void;function printInfo(value: string | number): void { if (typeof value ‘string’) { //typeof 返回后方变量的类型 console.log(‘文字信息’, value); } else { console.log(‘数字信息’, value); }}javascript静态属性通过static关键字声明访问方式为类名.属性名只读属性只读属性通过readonly关键字声明赋值后不可修改一般和静态属性一起使用属性与变量的区别变量类属性定义位置可在仍和作用域通过let/const关键字声明类内部声明通过修饰符修饰调用方式直接调用通过对象或类名静态方法调用生命周期由作用域决定如函数执行完毕即销毁与类实例同生命周期classDevice{name:string;}struct Example{letname:string智能电视letDevice1:Device{name:智能手表};console.log(变量值${name});console.log(类属性值${Device1.name});}类的方法类的方法是面向对象编程的核心组成部分用于封装对象的行为和操作。实例方法是类中定义的普通方法。需通过实例调用可通过this访问实例属性静态方法通过static关键字声明归属类而非实例无需实例化即可调用classDevice{name:string未知设备;//实例方法获取设备完整信息getInfo():string{return${this.name};}//静态方法验证设备名称是否合法staticisValidName(name:string):boolean{returnname.trim(),length0;}}letlightnewDevice();light.name客厅主灯;console.log(light.getInfo());//输出客厅主灯类型lightconsole.log(${Device.isValidBName(客厅主灯)});//输出true方法与函数的区别函数方法定义位置全局/模块作用域通过function关键字声明类内部调用方式直接调用通过对象或类名静态方法调用访问实例数据无通过this访问面向对象三大特征继承Q为什么需要继承A当在开发场景中遇到两个对应不同对象的类中具有很多的重复内容比如共性属性共性方法并且后续还要继续增加这种对象类。为了避免大量进行这种重复的工作我们将这些共性属性和方法统一抽取到一个公共类中再由不同的对象继承该公共类使其能够直接使用这些公共属性和方法的同时也能保留自己特有的属性和方法。super是子类访问父类构造函数、方法和属性实现继承逻辑复用语法。构造函数规则子类构造函数中必须首先通过super()调用父类构造函数且必须在访问this之前执行。classDevice{name:string;constructor(name:string){this.namename;}}classLightextendsDevice{brightness:number50;constructor(name:string,brightness:number){super(name);//内部调用superthis.brightnessbrightness;}setBrightness(value:number):void{this.brightnessvalue;console.log(${this,name}亮度设置为${value}%);}}letlight:LightnewLight(客厅灯,50);//lighr 50light.setBrightness(100);//light 100一个子类只能继承一个父类。继承后子类可以调用父类的方法和属性。封装类的封装是实现代码复用、逻辑内聚和数据安全的核心计数。通过访问修饰符private、protected、public限制属性和方法的可见性。若未明确指定修饰符ArkTS默认成员为public。可见范围适用场景public全局可见类内部、子类、外部均可访问公共接口。跨模块调用private仅类内部子类、外部均禁止封装敏感数据或内部逻辑protected类及子类同一模块内允许子类继承并扩展父类功能多态类的多态是同一行为方法在不同对象上有不同的实现。子类继承父类并且可以重写父类方法。classDevice{publicname:string;protectedstatus:stringoff;constructor(name:string){this.namename;}//父类统一方法子类可重写turnOn():void{console.log(${this.name}状态为${this.status});}}//灯光设备classLightextendsDevice{privatebrightness:number50;turnOn():void{this.status-on;console.log(${this.name}状态为${this.status},亮度为${this.status})}}//空调设备classAirConditionerextendsDevice{privatetemperature:number26;turnOn():void{this.status-on;console.log(${this.name}状态为${this.status},亮度为${this.status})}}抽象类抽象类通过abstract class声明是无法直接实例化的“规范类”作为父类被子类继承并实现抽象方法。用于定义子类必须遵循的接口标准。classDevice{publicname:string;protectedabstract status:stringoff;//抽象方法仅声明无方法体强制子类实现abstractturnOn():void;//普通方法子类可直接复用getStatus():string{return${this.name}状态为${this.status};}}classLightextendsDevice{//非抽象类Light没有实现从Device继承的抽象成员status.//非抽象类Light没有实现从Device继承的抽象成员turnOn.}需要注意以下几点非抽象子类继承抽象类时必须实现父类全部抽象方法若子类也声明为抽象类则可以暂不实现构造函数是不能加abstract的要么默认不写要么具体实现