鸿蒙学习实战之路:接口继承与多态:面向对象编程实践

接口继承与多态:面向对象编程实践

文章简介

在HarmonyOS应用开发中,面向对象编程是构建复杂应用的基础。本文将从接口继承和多态的基本概念出发,通过实际案例演示如何在HarmonyOS Next(API 10+)中运用这些重要特性。

官方参考资料:

版本说明: 本文所有代码示例基于HarmonyOS Next API 10+ 和 DevEco Studio 4.0+

接口基础概念

什么是接口?

接口是定义了一组方法签名的契约,任何实现该接口的类都必须提供这些方法的具体实现。在HarmonyOS开发中,接口是实现组件间通信和功能扩展的重要手段。

// 定义一个设备控制接口
interface DeviceController {
  turnOn(): void;
  turnOff(): void;
  getStatus(): boolean;
}

接口的基本语法

在仓颉语言中,接口定义使用interface关键字:

// 基础接口定义示例
interface NetworkConnectable {
  // 常量定义
  const MAX_RETRY_COUNT: number = 3;
  
  // 方法签名
  connect(ssid: string, password: string): boolean;
  disconnect(): void;
  getConnectionStatus(): ConnectionStatus;
}

接口方法特性:

  • 只声明方法签名,不包含实现
  • 可以包含常量属性
  • 支持访问修饰符(public、private等)
  • 方法默认是抽象的

接口继承详解

单接口继承

接口可以继承其他接口,形成层次结构:

// 基础设备接口
interface BaseDevice {
  getDeviceId(): string;
  getDeviceName(): string;
}

// 继承基础接口
interface SmartDevice extends BaseDevice {
  // 新增方法
  connectToNetwork(): boolean;
  updateFirmware(version: string): void;
  
  // 新增属性
  readonly isOnline: boolean;
}

多接口继承

仓颉语言支持多接口继承,让一个接口可以继承多个父接口:

// 定义多个基础接口
interface PowerManageable {
  setPowerLevel(level: number): void;
  getBatteryStatus(): BatteryStatus;
}

interface Networkable {
  connect(): boolean;
  disconnect(): void;
}

interface Configurable {
  configure(config: Object): void;
  resetToDefaults(): void;
}

// 多接口继承
interface SmartHomeDevice extends PowerManageable, Networkable, Configurable {
  // 新增设备特定方法
  executeScene(sceneId: string): void;
}

接口继承中的方法重写

在接口继承中,可以重新声明方法以添加更多约束:

interface AdvancedDeviceController extends DeviceController {
  // 重写父接口方法,添加参数
  turnOn(delay?: number): void;
  
  // 新增方法
  scheduleOperation(time: Date, operation: string): void;
}

多态性实现

基于接口的多态

多态允许使用统一的接口处理不同的实现:

// 定义智能家居设备接口
interface SmartHomeAppliance {
  getName(): string;
  turnOn(): void;
  turnOff(): void;
  getEnergyConsumption(): number;
}

// 具体实现类
class SmartLight implements SmartHomeAppliance {
  private brightness: number = 0;
  private isOn: boolean = false;

  getName(): string {
    return "智能灯具";
  }

  turnOn(): void {
    this.isOn = true;
    this.brightness = 100;
    console.log("智能灯具已开启,亮度:100%");
  }

  turnOff(): void {
    this.isOn = false;
    this.brightness = 0;
    console.log("智能灯具已关闭");
  }

  getEnergyConsumption(): number {
    return this.isOn ? 15 : 0; // 15瓦功耗
  }
}

class SmartThermostat implements SmartHomeAppliance {
  private temperature: number = 22;
  private isOn: boolean = false;

  getName(): string {
    return "智能温控器";
  }

  turnOn(): void {
    this.isOn = true;
    console.log(`温控器已开启,当前温度:${this.temperature}°C`);
  }

  turnOff(): void {
    this.isOn = false;
    console.log("温控器已关闭");
  }

  getEnergyConsumption(): number {
    return this.isOn ? 5 : 0; // 5瓦功耗
  }
}

多态使用示例

class SmartHomeManager {
  private appliances: SmartHomeAppliance[] = [];

  // 添加设备
  addAppliance(appliance: SmartHomeAppliance): void {
    this.appliances.push(appliance);
    console.log(`添加设备:${appliance.getName()}`);
  }

  // 统一开启所有设备
  turnOnAll(): void {
    console.log("开启所有智能设备...");
    this.appliances.forEach(appliance => {
      appliance.turnOn();
    });
  }

  // 计算总能耗
  calculateTotalEnergy(): number {
    return this.appliances.reduce((total, appliance) => {
      return total + appliance.getEnergyConsumption();
    }, 0);
  }

  // 设备状态报告
  generateStatusReport(): string {
    let report = "设备状态报告:\n";
    this.appliances.forEach(appliance => {
      report += `${appliance.getName()} - 能耗:${appliance.getEnergyConsumption()}W\n`;
    });
    report += `总能耗:${this.calculateTotalEnergy()}W`;
    return report;
  }
}

// 使用示例
let homeManager = new SmartHomeManager();
homeManager.addAppliance(new SmartLight());
homeManager.addAppliance(new SmartThermostat());

homeManager.turnOnAll();
console.log(homeManager.generateStatusReport());

实践案例:智能家居控制系统

案例设计

让我们构建一个完整的智能家居控制系统,展示接口继承和多态的实际应用:

// 基础设备接口层次
interface HomeDevice {
  readonly deviceId: string;
  getDeviceInfo(): DeviceInfo;
}

interface ControllableDevice extends HomeDevice {
  turnOn(): void;
  turnOff(): void;
  readonly isActive: boolean;
}

interface SensorDevice extends HomeDevice {
  readSensorData(): SensorData;
  readonly sensorType: SensorType;
}

// 组合接口
interface SmartSwitch extends ControllableDevice, SensorDevice {
  setBrightness(level: number): void;
  readonly maxBrightness: number;
}

具体实现类

// 设备信息类
class DeviceInfo {
  constructor(
    public deviceId: string,
    public deviceName: string,
    public manufacturer: string,
    public version: string
  ) {}
}

// 传感器数据类型
class SensorData {
  constructor(
    public timestamp: Date,
    public value: number,
    public unit: string
  ) {}
}

// 智能开关实现
class DimmerSwitch implements SmartSwitch {
  private active: boolean = false;
  private brightness: number = 0;
  private lastSensorRead: SensorData;

  constructor(
    public deviceId: string,
    public deviceName: string,
    public maxBrightness: number = 100
  ) {
    this.lastSensorRead = new SensorData(new Date(), 0, "lux");
  }

  // HomeDevice 接口实现
  getDeviceInfo(): DeviceInfo {
    return new DeviceInfo(
      this.deviceId,
      this.deviceName,
      "HarmonyTech",
      "1.0.0"
    );
  }

  // ControllableDevice 接口实现
  turnOn(): void {
    this.active = true;
    this.brightness = this.maxBrightness;
    console.log(`${this.deviceName} 已开启`);
  }

  turnOff(): void {
    this.active = false;
    this.brightness = 0;
    console.log(`${this.deviceName} 已关闭`);
  }

  get isActive(): boolean {
    return this.active;
  }

  // SensorDevice 接口实现
  readSensorData(): SensorData {
    // 模拟读取光照传感器数据
    const currentValue = Math.random() * 1000;
    this.lastSensorRead = new SensorData(new Date(), currentValue, "lux");
    return this.lastSensorRead;
  }

  get sensorType(): SensorType {
    return SensorType.LIGHT;
  }

  // SmartSwitch 特有方法
  setBrightness(level: number): void {
    if (level < 0 || level > this.maxBrightness) {
      throw new Error(`亮度级别必须在 0-${this.maxBrightness} 之间`);
    }
    this.brightness = level;
    this.active = level > 0;
    console.log(`${this.deviceName} 亮度设置为:${level}%`);
  }

  get currentBrightness(): number {
    return this.brightness;
  }
}

// 传感器类型枚举
enum SensorType {
  TEMPERATURE = "temperature",
  HUMIDITY = "humidity",
  LIGHT = "light",
  MOTION = "motion"
}

设备管理器实现

class HomeDeviceManager {
  private devices: Map<string, HomeDevice> = new Map();

  // 注册设备
  registerDevice(device: HomeDevice): void {
    this.devices.set(device.deviceId, device);
    const info = device.getDeviceInfo();
    console.log(`注册设备:${info.deviceName} (${info.deviceId})`);
  }

  // 获取所有可控设备
  getControllableDevices(): ControllableDevice[] {
    const result: ControllableDevice[] = [];
    this.devices.forEach(device => {
      if (this.isControllableDevice(device)) {
        result.push(device);
      }
    });
    return result;
  }

  // 获取所有传感器设备
  getSensorDevices(): SensorDevice[] {
    const result: SensorDevice[] = [];
    this.devices.forEach(device => {
      if (this.isSensorDevice(device)) {
        result.push(device);
      }
    });
    return result;
  }

  // 类型守卫函数
  private isControllableDevice(device: HomeDevice): device is ControllableDevice {
    return 'turnOn' in device && 'turnOff' in device;
  }

  private isSensorDevice(device: HomeDevice): device is SensorDevice {
    return 'readSensorData' in device && 'sensorType' in device;
  }

  // 执行场景
  executeScene(sceneName: string): void {
    console.log(`执行场景:${sceneName}`);
    
    switch (sceneName) {
      case "早晨唤醒":
        this.getControllableDevices().forEach(device => {
          if (device instanceof DimmerSwitch) {
            device.setBrightness(50);
          } else {
            device.turnOn();
          }
        });
        break;
        
      case "夜间模式":
        this.getControllableDevices().forEach(device => {
          device.turnOff();
        });
        break;
        
      default:
        console.log("未知场景");
    }
  }

  // 生成传感器报告
  generateSensorReport(): string {
    let report = "传感器数据报告:\n";
    this.getSensorDevices().forEach(sensor => {
      const data = sensor.readSensorData();
      report += `${sensor.getDeviceInfo().deviceName} (${sensor.sensorType}): ${data.value} ${data.unit}\n`;
    });
    return report;
  }
}

高级特性与最佳实践

接口中的默认方法

HarmonyOS Next支持接口中的默认方法实现:

interface UpdatableFirmware {
  // 抽象方法
  checkForUpdates(): boolean;
  
  // 默认方法实现
  performUpdate(): void {
    if (this.checkForUpdates()) {
      console.log("开始固件更新...");
      this.downloadUpdate();
      this.installUpdate();
      this.rebootDevice();
    } else {
      console.log("当前已是最新版本");
    }
  }
  
  // 私有方法(接口内部使用)
  private downloadUpdate(): void {
    console.log("下载更新包...");
  }
  
  private installUpdate(): void {
    console.log("安装更新...");
  }
  
  private rebootDevice(): void {
    console.log("重启设备...");
  }
}

接口组合模式

使用接口组合来构建复杂系统:

// 功能模块接口
interface Logger {
  log(message: string): void;
  error(message: string): void;
}

interface Configurable {
  loadConfig(config: Object): void;
  saveConfig(): Object;
}

interface Stateful {
  getState(): string;
  setState(state: string): void;
}

// 组合接口
interface AdvancedDevice extends Logger, Configurable, Stateful {
  initialize(): void;
  shutdown(): void;
}

// 基础实现类
abstract class BaseAdvancedDevice implements AdvancedDevice {
  protected state: string = "initialized";
  protected config: Object = {};

  // Logger 实现
  log(message: string): void {
    console.log(`[INFO] ${new Date().toISOString()}: ${message}`);
  }

  error(message: string): void {
    console.error(`[ERROR] ${new Date().toISOString()}: ${message}`);
  }

  // Configurable 实现
  loadConfig(config: Object): void {
    this.config = config;
    this.log("配置加载完成");
  }

  saveConfig(): Object {
    this.log("配置保存完成");
    return this.config;
  }

  // Stateful 实现
  getState(): string {
    return this.state;
  }

  setState(state: string): void {
    this.state = state;
    this.log(`状态变更为: ${state}`);
  }

  // 抽象方法
  abstract initialize(): void;
  abstract shutdown(): void;
}

开发步骤指南

步骤1:定义接口层次结构

  1. 分析需求,确定需要哪些功能模块
  2. 设计接口,按照单一职责原则划分接口
  3. 建立继承关系,使用接口继承构建层次结构
  4. 定义方法签名,明确每个接口的契约

步骤2:实现具体类

  1. 选择实现的接口,使用implements关键字
  2. 实现所有抽象方法,确保契约完整性
  3. 添加类特有功能,扩展基础功能
  4. 测试每个方法,确保正确性

步骤3:使用多态特性

  1. 创建接口类型集合,存储不同实现
  2. 统一方法调用,通过接口调用方法
  3. 利用类型守卫,处理特定类型逻辑
  4. 运行时类型检查,确保类型安全

步骤4:测试和优化

  1. 编写单元测试,验证每个实现
  2. 性能测试,确保系统效率
  3. 内存泄漏检查,监控资源使用
  4. 代码审查,优化设计模式

注意事项和常见问题

⚠️ 重要提示

  1. 接口契约完整性

    • 实现接口时必须实现所有方法
    • 确保方法签名完全匹配
    • 注意返回类型和参数类型一致性
  2. 多态使用注意事项

    // 错误示例:直接访问实现类特有方法
    let device: SmartHomeAppliance = new SmartLight();
    // device.setBrightness(50); // 编译错误
    
    // 正确做法:类型检查后访问
    if (device instanceof SmartLight) {
      device.setBrightness(50);
    }
    
  3. 版本兼容性

    • API 10+ 支持完整的接口继承特性
    • 早期版本可能不支持默认方法实现
    • 注意仓颉语言版本要求

🔧 常见陷阱及解决方案

问题现象 原因分析 解决方案
编译错误:未实现接口方法 接口方法签名不匹配或遗漏 检查implements声明,确保所有方法都已实现
运行时类型错误 多态使用时未进行类型检查 使用instanceof或类型守卫进行安全检查
接口方法冲突 多接口继承时方法名相同 使用显式接口实现或方法重命名
性能问题 频繁的类型检查和转换 优化设计,减少不必要的类型操作

需要参加鸿蒙认证的请点击 鸿蒙认证链接

posted @ 2025-11-26 17:11  时间煮鱼  阅读(9)  评论(0)    收藏  举报