在上一篇文章《Flutter for OpenHarmony:Dart 语言入门与实战指南上》中,我们掌握了 Dart 的基础语法、变量类型以及函数定义。今天,我们将进入 Dart 语言的进阶核心——面向对象编程(OOP)。在 Flutter 和 OpenHarmony 的开发中,Widget 本质上就是对象,因此深入理解类、继承、混入和异步机制,是写出高质量跨平台应用的关键。

1. 类与对象

Dart 是一门纯面向对象的语言,所有东西都是对象。定义类是封装数据和行为的基础。

1.1 Dart中类的定义

在 Dart 中,使用 class 关键字定义类,包含属性和方法。

class User {
  String name;
  int age;

  // 构造函数
  User(this.name, this.age);

  // 方法
  void introduce() {
    print("我是$name,今年$age岁");
  }
}

void main(List<String> args) {
  // 使用
  var user = User("Xuqing", 22); // 实例化并初始化
  user.introduce(); // 输出:我是Xuqing,今年22岁
  print(user.name); // 输出:Xuqing
  print(user.age); // 输出:22
}

在这里插入图片描述

1.2 Dart中类的默认构造函数

如果没有显式定义构造函数,Dart 会提供一个无参的默认构造函数。但通常我们需要在创建对象时初始化属性。


class Person 
{
  String name;
  int age;

   // 默认构造函数,显式写出来
  Person(String name, int age)
      : this.name = name, // this.name 指成员变量,name 指参数
        this.age = age {
  }
  // 方法:自我介绍
  void introduce() 
  {
    print("我是$name,今年$age岁");
  }

  // 方法:获取年龄描述
  String getAgeDescription() {
    if (age < 18) {
      return "未成年人";
    } else if (age < 60) {
      return "成年人";
    } else {
      return "老年人";
    }
  }
}

void main(List<String> args) 
{
  // 测试默认构造函数
  var person1 = Person("Xuqing", 22);
  person1.introduce();
  print("年龄描述:${person1.getAgeDescription()}");
  print("姓名:${person1.name}");
  print("年龄:${person1.age}");
}

在这里插入图片描述

1.3Dart中类的命名构造函数

由于 Dart 不支持函数重载,我们使用命名构造函数来提供多种初始化方式,例如从 JSON 创建对象。

class Person {
  String name;
  int age;
  // 命名构造函数
  Person.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        age = json['age'] {
  }
  // 方法:自我介绍
  void introduce() {
    print("我是$name,今年$age岁");
  }
  // 方法:获取年龄描述
  String getAgeDescription() {
    if (age < 18) {
      return "未成年人";
    } else if (age < 60) {
      return "成年人";
    } else {
      return "老年人";
    }
  }
}
  // 测试命名构造函数
  void main(List<String> args) {
  var jsonData = {'name': 'LiHua', 'age': 30};
  var person2 = Person.fromJson(jsonData);
  person2.introduce();
  print("年龄描述:${person2.getAgeDescription()}");
}

在这里插入图片描述

1.4Dart中类构造函数的语法糖写法

Dart 提供了简洁的语法糖,直接在参数前加 this. ,省去赋值步骤。

class Person {
  String name;
  int age;

  // 使用语法糖,一行代码替代了声明和赋值
  Person(this.name, this.age);
  // 方法:自我介绍
  void introduce() {
    print("我是$name,今年$age岁");
  }
  // 方法:获取年龄描述
  String getAgeDescription() {
    if (age < 18) {
      return "未成年人";
    } else if (age < 60) {
      return "成年人";
    } else {
      return "老年人";
    }
  }
}

void main(List<String> args) {
  // 测试默认构造函数
  var person1 = Person("Xuqing", 22);
  person1.introduce();
  print("年龄描述:${person1.getAgeDescription()}");
  print("姓名:${person1.name}");
  print("年龄:${person1.age}");
}

在这里插入图片描述

1.5类的公有属性和私有属性

Dart 中没有 public 或 private 关键字。下划线 _ 开头的变量或方法即为私有,仅在库内可见。

class BankAccount {
  double balance = 0;
  String _password = "123456"; // 私有属性,外部无法直接访问
  // 公有方法用于操作私有属性
  void deposit(double amount) {
    balance += amount;
  }

  // 方法:获取余额
  double getBalance() {
    return balance;
  }
}
void main(List<String> args) {
  // 验证 BankAccount 类
  var account = BankAccount();
  print("初始余额: ${account.getBalance()}");
  
  account.deposit(100.50);
  print("存款后余额: ${account.getBalance()}");
  
  account.deposit(50.25);
  print("再次存款后余额: ${account.getBalance()}");
  
  // 注意:无法直接访问 _password 属性
  // print(account._password); // 这行代码会报错
}

在这里插入图片描述

2. 继承与多态:代码复用与扩展

2.1Dart中类的继承

使用 extends 关键字实现继承,子类可以拥有父类的属性和方法。

class Animal {
  void eat() {
    print("Animal is eating");
  }
}

class Dog extends Animal {
  void bark() {
    print("Woof!");
  }
}

void main() {
  var dog = Dog();
  dog.eat(); // 继承自 Animal
  dog.bark(); // Dog 自己的方法
}

在这里插入图片描述

2.2Dart中类的多态

多态允许子类重写父类的方法,实现不同的行为。

class Animal {
  void makeSound() {
    print("Some generic sound");
  }
}

class Cat extends Animal {
  
  void makeSound() {
    print("Meow"); // 重写父类方法
  }
}

void main() {
  var animal = Animal();
  animal.makeSound();
  
  var cat = Cat();
  cat.makeSound();
}

在这里插入图片描述

2.3Dart中类的多态-抽象和接口实现

Dart 使用 abstract 关键字定义抽象类,强制子类实现特定方法(类似接口)。

abstract class Shape {
  void draw(); // 抽象方法,没有方法体
}

class Circle implements Shape { // 或者使用 extends
  
  void draw() {
    print("Drawing a Circle");
  }
}
void main() {
  var circle = Circle();
  circle.draw();
}

在这里插入图片描述

3. 高级特性:混入与泛型

3.1Dart中类的混入

为了解决单继承的限制,Dart 引入了 Mixin(混入),允许在多个类层次结构之外复用代码。

mixin Flyable {
  void fly() {
    print("I can fly!");
  }
}

class Bird {
  void eat() => print("Eating...");
}

// with 关键字混入 Flyable 的能力
class Parrot extends Bird with Flyable {}

void main() {
  var parrot = Parrot();
  parrot.eat(); // 来自 Bird
  parrot.fly(); // 来自 Flyable
}

在这里插入图片描述

3.2Dart中的泛型

泛型允许我们创建可重用的组件,这些组件可以处理多种数据类型,同时保证类型安全。

// 定义一个泛型类 Box,可以装任何类型的东西
class Box<T> {
  T content;
  Box(this.content);
}

void main() {
  var intBox = Box<int>(10); // 装整数的盒子
  print(intBox.content); // 使用变量,避免未使用警告
  var strBox  = Box<String>("Hello"); // 装字符串的盒子
  print(strBox.content); // 使用变量,避免未使用警告
  // var wrongBox = Box<int>("Hello"); // 编译报错,类型不匹配
}

在这里插入图片描述

4. 异步编程:非阻塞IO

4.1Dart中的异步编程

在移动开发中,网络请求不能阻塞主线程。Dart 使用 Future 和 async/await 处理异步操作。

// 模拟一个耗时的网络请求
Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2)); // 模拟延迟
  return "Data from server";
}

// 使用 async/await 调用异步函数
void main() async {
  print("Loading...");
  String data = await fetchData(); // 等待结果,但不阻塞UI
  print(data); // 2秒后输出:Data from server
}

在这里插入图片描述

5.结语

至此,我们完成了 Dart 语言核心部分的学习。从类的定义到复杂的异步处理,这些知识是构建 Flutter 和 OpenHarmony 应用的骨架。建议大家动手实践这些代码,理解面向对象的设计思想,这将为你后续的跨平台开发之路打下坚实的基础。谢谢大家观看,有不足之处请见谅。

欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐