接口繼承與多態:面向對象編程實踐

文章簡介

在HarmonyOS應用開發中,面向對象編程是構建複雜應用的基礎。本文將從接口繼承和多態的基本概念出發,通過實際案例演示如何在HarmonyOS Next(API 10+)中運用這些重要特性。

官方參考資料:

  • ArkTS語言介紹
  • TypeScript官網

版本説明: 本文所有代碼示例基於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. 接口契約完整性
  • 實現接口時必須實現所有方法
  • 確保方法簽名完全匹配
  • 注意返回類型和參數類型一致性
  1. 多態使用注意事項
// 錯誤示例:直接訪問實現類特有方法
let device: SmartHomeAppliance = new SmartLight();
// device.setBrightness(50); // 編譯錯誤

// 正確做法:類型檢查後訪問
if (device instanceof SmartLight) {
  device.setBrightness(50);
}
  1. 版本兼容性
  • API 10+ 支持完整的接口繼承特性
  • 早期版本可能不支持默認方法實現
  • 注意倉頡語言版本要求

🔧 常見陷阱及解決方案

問題現象

原因分析

解決方案

編譯錯誤:未實現接口方法

接口方法簽名不匹配或遺漏

檢查implements聲明,確保所有方法都已實現

運行時類型錯誤

多態使用時未進行類型檢查

使用instanceof或類型守衞進行安全檢查

接口方法衝突

多接口繼承時方法名相同

使用顯式接口實現或方法重命名

性能問題

頻繁的類型檢查和轉換

優化設計,減少不必要的類型操作

性能優化建議

// 優化前:頻繁的類型檢查
devices.forEach(device => {
  if (device instanceof SmartLight) {
    // 處理燈光
  } else if (device instanceof SmartThermostat) {
    // 處理