HarmonyOS ArkTS 面向对象编程:class、interface 完全指南 文章目录前言一、class封装数据与行为1.1 最基本的类定义1.2 本项目中的 MapUtil 类分析二、interface定义数据形状2.1 interface 的用途2.2 interface vs class vs type 的选择三、继承复用和扩展类3.1 extends 继承3.2 implements类实现接口四、访问控制public/private/protected五、静态成员不需要实例的工具方法总结前言在 HarmonyOS 开发中代码不可能全部堆在一个文件里。**类class和接口interface**是组织代码、实现复用的核心工具。本项目中的MapUtil、PermissionsUtil、CalculateUtil、Logger等都是精心设计的类它们让复杂逻辑封装成简洁的 API。本篇通过分析项目中的类设计结合可运行示例带你掌握 ArkTS 面向对象编程的精髓。一、class封装数据与行为1.1 最基本的类定义// 定义一个加油站类classGasStation{// 属性成员变量id:string;name:string;latitude:number;longitude:number;brand:string;isOpen:boolean;// 构造函数constructor(id:string,name:string,lat:number,lng:number,brand:string){this.idid;this.namename;this.latitudelat;this.longitudelng;this.brandbrand;this.isOpentrue;// 默认开业}// 方法获取格式化的坐标字符串getCoordinateString():string{return${this.latitude.toFixed(4)},${this.longitude.toFixed(4)};}// 方法判断是否是中国石化isSinopec():boolean{returnthis.brand中国石化;}// 方法切换营业状态toggleOpen():void{this.isOpen!this.isOpen;}// toString 方便调试toString():string{return[${this.brand}]${this.name}${this.getCoordinateString()}(${this.isOpen?营业中:休息中});}}// 创建实例conststation1newGasStation(001,望京加油站,40.0046,116.4823,中国石化);conststation2newGasStation(002,朝阳加油站,39.9219,116.4386,中国石油);console.log(station1.toString());// [中国石化] 望京加油站 40.0046, 116.4823 (营业中)console.log(station1.isSinopec());// truestation1.toggleOpen();console.log(station1.isOpen);// false1.2 本项目中的 MapUtil 类分析Observed// ← HarmonyOS 特有使类属性变化可被观察exportclassMapUtil{// 方法1坐标转换异步publicasyncconvertToGCJ02(latitude:number,longitude:number):PromisemapCommon.LatLng{lettheWGS84Position:mapCommon.LatLng{latitude,longitude};lettheGCJ02Position:mapCommon.LatLngawaitmap.convertCoordinate(mapCommon.CoordinateType.WGS84,mapCommon.CoordinateType.GCJ02,theWGS84Position);returntheGCJ02Position;}// 方法2移动地图到指定位置publicmoveToCurrentPosition(latitude:number,longitude:number,mapController:map.MapComponentController):void{letcameraPosition:mapCommon.CameraPosition{target:{latitude,longitude},zoom:15.9};letcameraUpdate:map.CameraUpdatemap.newCameraPosition(cameraPosition);mapController?.animateCamera(cameraUpdate,500);}// 方法3获取当前位置asyncgetMyLocation():PromisegeoLocationManager.Location{returnawaitgeoLocationManager.getCurrentLocation();}// ... 更多方法}// 导出单例实例整个应用共享一个 MapUtil 实例exportconstmapUtil:MapUtilnewMapUtil();设计亮点Observed让类实例的属性变化能触发 UI 更新public关键字显式声明公开方法导出单例mapUtil避免重复创建实例二、interface定义数据形状2.1 interface 的用途interface只定义形状有哪些属性和方法不包含实现逻辑// 定义加油站的数据接口interfaceIStation{id:string;name:string;latitude:number;longitude:number;image:Resource;// HarmonyOS 资源类型addr:string;}// 定义可定位的接口interfaceILocatable{latitude:number;longitude:number;getCoordinateString():string;}// 定义可收藏的接口interfaceIFavoritable{isFavorite:boolean;toggleFavorite():void;}2.2 interface vs class vs type 的选择特性interfaceclasstype只描述形状✅❌有实现✅包含方法实现❌✅❌可以实例化❌✅❌可以继承/实现✅extends✅extends❌适用场景API类型约束、数据形状工具类、单例复杂联合类型// 场景1用 interface 约束函数参数推荐interfaceMapConfig{zoom:number;latitude:number;longitude:number;showMyLocation?:boolean;// 可选属性}functioninitMap(config:MapConfig):void{console.log(初始化地图缩放级别${config.zoom});}initMap({zoom:16,latitude:39.9,longitude:116.4});// ✅initMap({zoom:16});// ❌ 缺少必需属性// 场景2用 type 定义联合类型推荐typeMapTypestandard|satellite|terrain;typeLoadStatusloading|success|error|empty;// 场景3用 class 封装逻辑推荐classMapManager{privatestaticinstance:MapManager;staticgetInstance():MapManager{if(!MapManager.instance){MapManager.instancenewMapManager();}returnMapManager.instance;}init(config:MapConfig):void{// 初始化逻辑}}三、继承复用和扩展类3.1 extends 继承// 基础工具类classBaseUtil{protectedtag:string;constructor(tag:string){this.tagtag;}// 基础日志方法protectedlog(level:string,message:string):void{consttimestampnewDate().toISOString();console.log([${timestamp}][${level}][${this.tag}]${message});}info(message:string):void{this.log(INFO,message);}error(message:string):void{this.log(ERROR,message);}}// 地图工具继承基础工具类classExtendedMapUtilextendsBaseUtil{privatezoom:number16;constructor(){super(MapUtil);// 调用父类构造函数}// 新增方法setZoom(zoom:number):void{if(zoom3||zoom21){this.error(缩放级别${zoom}超出范围 [3, 21]);return;}this.zoomzoom;this.info(缩放级别设置为${zoom});}getZoom():number{returnthis.zoom;}// 重写父类方法info(message:string):void{// 在基础 log 前加上地图专属前缀super.log(MAP-INFO,️${message});}}constmapUtil2newExtendedMapUtil();mapUtil2.info(地图初始化完成);// ️ 地图初始化完成mapUtil2.setZoom(25);// ERROR: 缩放级别超出范围mapUtil2.setZoom(15);// ️ 缩放级别设置为 153.2 implements类实现接口interfaceICalculator{calculate(a:number,b:number):number;format(result:number):string;}// 距离计算器classDistanceCalculatorimplementsICalculator{calculate(lat1:number,lng1:number):number{// 简化实现returnMath.sqrt(Math.pow(lat1,2)Math.pow(lng1,2));}// 必须实现接口定义的所有方法format(result:number):string{return${result.toFixed(1)}km;}}// 油价计算器同一接口不同实现classPriceCalculatorimplementsICalculator{calculate(liters:number,pricePerLiter:number):number{returnliters*pricePerLiter;}format(result:number):string{return¥${result.toFixed(2)};}}四、访问控制public/private/protectedclassStationRepository{// private只能在类内部访问private_stations:GasStation[][];private_isLoaded:booleanfalse;// protected类内部和子类可访问protectedmaxCount:number100;// public外部可访问默认就是 publicpublicgetstations():GasStation[]{returnthis._stations;}publicgetisLoaded():boolean{returnthis._isLoaded;}// 私有方法内部逻辑不对外暴露privatevalidate(station:GasStation):boolean{returnstation.name.length0station.latitude!0;}// 公开方法对外提供的 APIpublicadd(station:GasStation):boolean{if(!this.validate(station)){returnfalse;}if(this._stations.lengththis.maxCount){returnfalse;}this._stations.push(station);returntrue;}publicfindById(id:string):GasStation|undefined{returnthis._stations.find(ss.idid);}}constreponewStationRepository();// repo._stations // ❌ 无法访问 private// repo.maxCount // ❌ 无法访问 protected在类外console.log(repo.stations);// ✅ 通过 getter 访问五、静态成员不需要实例的工具方法// CalculateUtil 使用了静态方法模式不需要 newclassCalculateUtil{// static 方法直接通过类名调用不需要创建实例publicstaticgetDistance(lat1:number,long1:number,lat2:number,long2:number):string{// ... 计算距离returndistance.toFixed(1);}}// 调用方式直接用类名constdistCalculateUtil.getDistance(39.9,116.4,40.0,116.5);// 不需要 new CalculateUtil()// 静态常量classConstants{staticreadonlyFONT_SIZE_1616;staticreadonlyFONT_WEIGHT_700700;staticreadonlyFULL_PERCENT100%;}总结ArkTS 的类和接口是构建大型 HarmonyOS 应用的基础class封装数据和行为interface约束数据形状extends实现继承复用访问控制保证封装性静态成员提供无需实例化的工具方法。本项目中的四个工具类MapUtil、CalculateUtil、PermissionsUtil、Logger完美诠释了面向对象设计原则是学习类设计的绝佳参考。