在掌握了Dart的基础语法之后,我们正式踏入进阶殿堂。本文将深入剖析面向对象编程(OOP)的四大支柱,并解锁泛型与异步编程的实战技巧。这些核心能力不仅是构建高质量Flutter应用的地基,更是你理解HarmonyOS跨端开发逻辑、驾驭AI与神经网络应用性能瓶颈的关键。准备好让你的代码从'能跑'进化到'健壮且优雅'了吗?

类与封装:Dart的私有性哲学
Dart作为一门纯面向对象语言,一切皆对象,包括数字、函数乃至null。与Java或C++不同,Dart没有public或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();
}
运行结果如下,注意私有属性_secret在类外部是如何被阻止访问的:

继承与多态:构建可扩展的AI架构
继承是代码复用的基石。在Dart中,通过extends关键字实现单继承。子类可以覆写父类的方法,实现多态。这在处理复杂业务逻辑时极为重要——例如,在自然语言处理(NLP)场景中,你可以定义一个抽象的TextProcessor基类,然后派生出不用的具体实现。
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(); // 调用子类特有方法
}
运行结果展示了子类如何覆写父类行为:

多态则允许我们以统一的接口处理不同的对象类型。这在大规模AI系统中至关重要,它让你能够编写针对抽象基类的通用算法,而不必关心具体实现细节,从而极大地提升系统的灵活性和可维护性。
多态指同一接口,不同实现。在 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 函数。
混入(Mixin):横向复用与能力注入
Dart不支持多继承,但提供了混入(Mixin)机制,用于在多个类层次结构之间横向复用代码。Mixin可以看作是一个没有构造函数的类,通过with关键字将其能力注入到目标类中。这非常适合为不相关的类添加共同的行为,例如为设备类添加日志记录、网络状态监听,或为数据模型添加序列化能力。
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 特别适合为类添加横向能力(如日志、缓存、网络状态监听等),避免类层次过深。
泛型:类型安全与算法复用
泛型是构建类型安全且可复用代码的利器。它允许你在定义类或方法时使用类型占位符,而在实际使用时再指定具体类型。这不仅能减少代码重复,还能在编译期捕获类型错误,避免运行时异常。在涉及深度学习的张量运算或集合数据处理时,泛型能确保数据流的准确性。
✅ 泛型类示例: 定义一个通用的缓存或数据仓库类,可存储任意类型的数据。
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 等。
异步编程:Future与Stream的协奏曲
Dart是单线程语言,但通过事件循环(Event Loop)实现了非阻塞的异步I/O。这是处理网络请求、文件读写以及流畅UI渲染的核心。在AI应用中,异步编程对于加载大型模型或处理流式数据(如实时语音识别)至关重要,能有效避免阻塞UI线程。
Future: 用于处理单次异步操作,类似于JavaScript中的Promise。它代表一个最终会完成或失败的操作。
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2)); // 模拟网络请求
return "从 HarmonyOS 服务获取的数据";
}
void main() async {
print("开始请求...");
String data = await fetchData();
print("收到数据: $data");
print("请求完成");
}
输出顺序揭示了异步代码的执行逻辑:

Stream: 用于处理一系列异步事件。与Future不同,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("监听已启动");
}
输出效果:
[AFFILIATE_SLOT_1]
实战建议与延伸思考
理论终究要落地。要真正掌握这些特性,建议你动手实践以下挑战:
- 组合实践: 尝试创建一个带泛型的异步数据仓库类,结合Mixin为它添加日志记录功能。
- 架构思考: 在构建一个AI推理引擎时,思考如何利用继承和接口来抽象不同的神经网络模型(如CNN、RNN),利用多态实现统一的推理接口。
- 性能优化: 在处理大量数据流时,使用Stream的转换操作符(如
map、where)进行函数式处理,这在自然语言处理的数据预处理阶段非常高效。
⚠️ 注意事项: 虽然Mixin很强大,但过度使用会导致代码结构混乱,难以追踪方法的来源。建议只在逻辑关联紧密的类之间使用Mixin。
[AFFILIATE_SLOT_2]结语:迈向跨平台开发的星辰大海
至此,你已经解锁了Dart语言最核心的进阶特性:从类与封装的私有性哲学,到继承与多态的架构设计,再到Mixin的横向复用,以及泛型和异步编程的实战能力。这些核心技能不仅是构建高质量Flutter应用的基石,更是你深入探索HarmonyOS分布式能力、驾驭未来AI与机器学习应用的关键桥梁。记住,编码之路没有捷径,唯有不断实践与思考,才能真正将这些知识内化为你的肌肉记忆。
欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net
浙公网安备 33010602011771号