flutter
个人主页:ujainu

前言

在前两一篇《Flutter for HarmonyOS 前置知识:Dart语言详解(中)》中,我们掌握了变量、数据类型、控制结构等核心语法。这些内容为你打下了坚实的基础。现在,我们将进入 Dart 的面向对象编程(OOP)世界,深入探讨类、继承、多态、混入等关键概念,并进一步学习 泛型 和 异步编程——这两者是构建高性能 Flutter 应用和 HarmonyOS 跨端能力不可或缺的利器。
无论你是准备深入 Flutter 开发,还是探索 HarmonyOS 的分布式能力,掌握这些进阶特性,都能让你写出更健壮、可维护、高性能的代码。本文将通过清晰的示例和实用场景,带你系统掌握 Dart 的进阶核心。

Dart 是一门纯面向对象语言,一切皆对象,所有值都是某个类的实例(包括数字、函数甚至 null)。类是封装数据(属性)和行为(方法)的基本单元。

类的公有属性和私有属性

在 Dart 中,没有 public、private 关键字。属性或方法的可见性由其命名方式决定:

  • 以 _(下划线)开头的标识符:表示库内私有(library-private),仅在定义它的 .dart 文件中可见。
  • 不以下划线开头:默认为公有,可在任何地方访问。
// Dart私有和公有属性示例
class Person {
  // 公有属性
  String name;
  int age;
  // 私有属性
  String _id;
  String _phone;

  Person(this.name, this.age, String id, String phone) : 
    _id = id, _phone = phone;

  // 访问私有属性
  String getId() => _id;
  String getPhone() => _phone;

  // 修改私有属性
  void setPhone(String phone) {
    _phone = phone;
  }

  void info() {
    print("名字: $name, 年龄: $age");
    print("ID: $_id, 电话: $_phone");
  }
}

void main() {
  print("=== 私有和公有属性示例 ===");
  var p = Person("张三", 20, "12345", "13800138000");
  print("\n公有属性:");
  print("  名字: ${p.name}");
  print("  年龄: ${p.age}");
  print("\n私有属性:");
  print("  ID: ${p.getId()}");
  print("  电话: ${p.getPhone()}");
  print("\n修改电话:");
  p.setPhone("13900139000");
  print("  新电话: ${p.getPhone()}");
  print("\n全部信息:");
  p.info();
}

运行结果:
类的公有属性和私有属性

类的继承

Dart 支持单继承,使用 extends 关键字。子类可以继承父类的公有属性和方法,并可重写(override)它们。

// 父类
class Vehicle {
  String brand;
  Vehicle(this.brand);

  void start() {
    print(" $brand 车辆启动");
  }
}

// 子类
class ElectricCar extends Vehicle {
  int batteryCapacity;

  ElectricCar(String brand, this.batteryCapacity) : super(brand);

  
  void start() {
    print(" $brand 电动车启动,电池容量: ${batteryCapacity}kWh");
  }

  void charge() {
    print(" $brand 正在充电");
  }
}

void main() {
  var car = ElectricCar("鸿蒙智行", 100);
  car.start();  // 调用重写后的方法
  car.charge(); // 调用子类特有方法
}

运行结果:
类的继承

类的多态

多态指同一接口,不同实现。在 Dart 中,通过父类引用指向子类实例,并调用被重写的方法来体现。

// 父类
class Vehicle {
  String brand;
  Vehicle(this.brand);

  void start() {
    print("$brand 车辆启动");
  }
}

// 子类
class ElectricCar extends Vehicle {
  int batteryCapacity;

  ElectricCar(String brand, this.batteryCapacity) : super(brand);

  
  void start() {
    print("$brand 电动车启动,电池容量: ${batteryCapacity}kWh");
  }
}

void testVehicle(Vehicle v) {
  v.start(); // 实际调用的是子类的 start 方法
}

void main() {
  var gasCar = Vehicle("燃油车");
  var elecCar = ElectricCar("电动车", 75);

  testVehicle(gasCar); // 输出:燃油车 车辆启动
  testVehicle(elecCar); // 输出:电动车 电动车启动,电池容量: 75kWh
}

运行结果:
在这里插入图片描述

多态让代码更具扩展性。未来新增 HybridCar,无需修改 testVehicle 函数。

类的混入

Dart 不支持多继承,但可通过 Mixin 实现“多继承”的效果。Mixin 是一种可复用的代码模块,可在多个类中组合使用。

// 定义 Mixin
mixin Flyable {
  void fly() {
    print("正在飞行");
  }
}

mixin Swimmable {
  void swim() {
    print("正在游泳");
  }
}

// 使用 Mixin
class Duck extends Animal with Flyable, Swimmable {
  
  void makeSound() {
    print("嘎嘎叫");
  }
}

class Animal {
  void makeSound() {
    print("动物发声");
  }
}

void main() {
  var duck = Duck();
  duck.makeSound(); // 来自 Animal
  duck.fly();       // 来自 Flyable
  duck.swim();      // 来自 Swimmable
}

运行结果:
在这里插入图片描述

Mixin 特别适合为类添加横向能力(如日志、缓存、网络状态监听等),避免类层次过深。

dart中的泛型

泛型(Generics)用于编写类型安全且可复用的代码。它允许你在定义类、方法或接口时,不指定具体类型,而是在使用时再确定。

泛型类示例

class Box<T> {
  T content;

  Box(this.content);

  T getContent() => content;

  void setContent(T newContent) {
    content = newContent;
  }
}

void main() {
  var stringBox = Box<String>("Hello Dart");
  var intBox = Box<int>(42);

  print(stringBox.getContent().runtimeType); // String
  print(intBox.getContent().runtimeType);    // int

  // stringBox.setContent(100); // ❌ 编译错误!类型不匹配
}

运行结果:
在这里插入图片描述

泛型方法

T firstElement<T>(List<T> list) {
  if (list.isEmpty) throw Exception("列表为空");
  return list[0];
}

void main() {
  var names = ["张三", "李四"];
  var scores = [90, 85];

  print(firstElement(names)); // 张三
  print(firstElement(scores)); // 90
}

运行结果:
在这里插入图片描述

泛型在 Flutter 中无处不在,如 List、Future、Stream 等。

dart中的异步编程

Dart 是单线程语言,但通过 事件循环(Event Loop)Future/Stream 模型实现高效的异步非阻塞 I/O。

Future:处理单次异步操作

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2)); // 模拟网络请求
  return "从 HarmonyOS 服务获取的数据";
}

void main() async {
  print("开始请求...");
  String data = await fetchData();
  print("收到数据:  $data");
  print("请求完成");
}

输出顺序:
在这里插入图片描述

Stream:处理多次异步事件

Stream<int> countStream(int to) async* {
  for (int i = 1; i <= to; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() {
  print("开始计数...");
  countStream(3).listen((number) {
    print("当前数字:  $number");
  });
  print("监听已启动");
}

输出:
在这里插入图片描述

结语

恭喜你!至此,你已经掌握了 Dart 语言的核心进阶特性:

  • 通过类、继承、多态、混入,构建清晰、可扩展的面向对象架构;
  • 利用泛型提升代码的类型安全性和复用性;
  • 借助 Future 和 Stream 高效处理异步任务,为 Flutter 动画、网络请求、HarmonyOS 分布式通信打下坚实基础。

这些能力不仅是 Dart 的精华,更是你通往 Flutter 高级开发HarmonyOS 生态融合的关键桥梁。建议你动手实践每一个示例,尝试组合这些特性——比如创建一个带泛型的异步数据仓库类,或使用 Mixin 为设备类添加网络状态监听。
Dart 的旅程才刚刚深入,真正的跨平台魔法,正等着你去施展!

🌟 欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区!

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐