Dart类与对象 #

一、类基础 #

1.1 类定义 #

dart
class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  void sayHello() {
    print('Hello, I am $name, $age years old.');
  }
  
  String get info => 'Name: $name, Age: $age';
  
  set setName(String value) {
    name = value;
  }
}

var person = Person('Alice', 25);
person.sayHello();
print(person.info);
person.setName = 'Bob';

1.2 成员变量 #

dart
class User {
  String name;
  int _age;
  static int count = 0;
  static const String type = 'user';
  
  User(this.name, this._age) {
    count++;
  }
  
  int get age => _age;
  set age(int value) => _age = value;
}

二、构造函数 #

2.1 默认构造函数 #

dart
class Point {
  double x;
  double y;
  
  Point(this.x, this.y);
}

var point = Point(3.0, 4.0);

2.2 命名构造函数 #

dart
class Point {
  double x;
  double y;
  
  Point(this.x, this.y);
  
  Point.origin() : x = 0, y = 0;
  
  Point.fromJSON(Map<String, dynamic> json)
      : x = json['x'],
        y = json['y'];
}

var origin = Point.origin();
var fromJson = Point.fromJSON({'x': 1.0, 'y': 2.0});

2.3 初始化列表 #

dart
class Rectangle {
  final double width;
  final double height;
  final double area;
  
  Rectangle(this.width, this.height) : area = width * height;
  
  Rectangle.square(double size) 
      : width = size, 
        height = size, 
        area = size * size;
}

2.4 重定向构造函数 #

dart
class User {
  String name;
  int age;
  
  User(this.name, this.age);
  
  User.guest() : this('Guest', 0);
  
  User.fromName(String name) : this(name, 18);
}

2.5 常量构造函数 #

dart
class ImmutablePoint {
  final double x;
  final double y;
  
  const ImmutablePoint(this.x, this.y);
  
  static const origin = ImmutablePoint(0, 0);
}

const point = ImmutablePoint(3.0, 4.0);

2.6 工厂构造函数 #

dart
class Logger {
  final String name;
  static final Map<String, Logger> _cache = {};
  
  Logger._internal(this.name);
  
  factory Logger(String name) {
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  }
}

var logger1 = Logger('app');
var logger2 = Logger('app');
print(identical(logger1, logger2));

三、继承 #

3.1 基本继承 #

dart
class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  String breed;
  
  Dog(String name, this.breed) : super(name);
  
  @override
  void speak() {
    print('$name barks');
  }
  
  void fetch() {
    print('$name fetches the ball');
  }
}

var dog = Dog('Buddy', 'Golden Retriever');
dog.speak();
dog.fetch();

3.2 super关键字 #

dart
class Vehicle {
  String brand;
  
  Vehicle(this.brand);
  
  void start() {
    print('$brand vehicle starting...');
  }
}

class Car extends Vehicle {
  String model;
  
  Car(String brand, this.model) : super(brand);
  
  @override
  void start() {
    super.start();
    print('$brand $model is ready to go!');
  }
}

3.3 抽象类 #

dart
abstract class Shape {
  double area();
  double perimeter();
  
  void describe() {
    print('Area: ${area()}, Perimeter: ${perimeter()}');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(this.radius);
  
  @override
  double area() => 3.14159 * radius * radius;
  
  @override
  double perimeter() => 2 * 3.14159 * radius;
}

class Rectangle extends Shape {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  @override
  double area() => width * height;
  
  @override
  double perimeter() => 2 * (width + height);
}

四、接口 #

4.1 隐式接口 #

dart
class Flyable {
  void fly() {
    print('Flying...');
  }
}

class Swimmable {
  void swim() {
    print('Swimming...');
  }
}

class Duck implements Flyable, Swimmable {
  @override
  void fly() {
    print('Duck is flying');
  }
  
  @override
  void swim() {
    print('Duck is swimming');
  }
}

4.2 abstract class vs interface #

dart
abstract class Drawable {
  void draw();
  
  void render() {
    draw();
  }
}

class Circle implements Drawable {
  @override
  void draw() {
    print('Drawing circle');
  }
}

class Square extends Drawable {
  @override
  void draw() {
    print('Drawing square');
  }
}

五、混入(Mixin) #

5.1 基本Mixin #

dart
mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
}

mixin Timing {
  void timeIt(void Function() action) {
    var start = DateTime.now();
    action();
    var end = DateTime.now();
    print('Elapsed: ${end.difference(start)}');
  }
}

class Service with Logging, Timing {
  void doWork() {
    log('Starting work');
    timeIt(() {
      for (var i = 0; i < 1000000; i++) {}
    });
  }
}

5.2 Mixin约束 #

dart
abstract class Animal {
  String get name;
}

mixin Walker on Animal {
  void walk() {
    print('$name is walking');
  }
}

mixin Runner on Animal {
  void run() {
    print('$name is running');
  }
}

class Human extends Animal with Walker, Runner {
  @override
  String get name => 'Human';
}

5.3 Mixin应用场景 #

dart
mixin JsonSerializable {
  Map<String, dynamic> toJson();
  
  String toJsonString() {
    return toJson().toString();
  }
}

mixin Validatable {
  bool validate();
  
  void validateOrThrow() {
    if (!validate()) {
      throw Exception('Validation failed');
    }
  }
}

class User with JsonSerializable, Validatable {
  String name;
  String email;
  
  User(this.name, this.email);
  
  @override
  Map<String, dynamic> toJson() => {
    'name': name,
    'email': email,
  };
  
  @override
  bool validate() => name.isNotEmpty && email.contains('@');
}

六、静态成员 #

6.1 静态变量和方法 #

dart
class MathUtils {
  static const double pi = 3.14159;
  static int calculationCount = 0;
  
  static double circleArea(double radius) {
    calculationCount++;
    return pi * radius * radius;
  }
  
  static double circleCircumference(double radius) {
    calculationCount++;
    return 2 * pi * radius;
  }
}

print(MathUtils.pi);
print(MathUtils.circleArea(5));
print(MathUtils.calculationCount);

6.2 静态常量 #

dart
class AppConstants {
  static const String appName = 'MyApp';
  static const String version = '1.0.0';
  static const int maxRetryCount = 3;
  static const Duration timeout = Duration(seconds: 30);
}

七、操作符重载 #

7.1 基本操作符 #

dart
class Vector {
  final double x;
  final double y;
  
  const Vector(this.x, this.y);
  
  Vector operator +(Vector other) => Vector(x + other.x, y + other.y);
  Vector operator -(Vector other) => Vector(x - other.x, y - other.y);
  Vector operator *(double scalar) => Vector(x * scalar, y * scalar);
  
  bool operator ==(Object other) =>
      other is Vector && x == other.x && y == other.y;
  
  @override
  int get hashCode => Object.hash(x, y);
}

var v1 = Vector(2, 3);
var v2 = Vector(4, 5);
var v3 = v1 + v2;
var v4 = v1 * 2;

八、扩展方法 #

8.1 基本扩展 #

dart
extension StringExtension on String {
  String get capitalized {
    if (isEmpty) return this;
    return '${this[0].toUpperCase()}${substring(1)}';
  }
  
  bool get isEmail {
    return contains('@') && contains('.');
  }
}

print('hello'.capitalized);
print('test@example.com'.isEmail);

8.2 扩展方法 #

dart
extension ListExtension<T> on List<T> {
  T? firstWhereOrNull(bool Function(T) test) {
    for (var element in this) {
      if (test(element)) return element;
    }
    return null;
  }
  
  List<T> sorted(int Function(T, T) compare) {
    var list = [...this];
    list.sort(compare);
    return list;
  }
}

var numbers = [3, 1, 4, 1, 5];
var first = numbers.firstWhereOrNull((n) => n > 3);
var sorted = numbers.sorted((a, b) => a.compareTo(b));

8.3 扩展属性 #

dart
extension DateTimeExtension on DateTime {
  bool get isToday {
    final now = DateTime.now();
    return year == now.year && month == now.month && day == now.day;
  }
  
  bool get isWeekend {
    return weekday == DateTime.saturday || weekday == DateTime.sunday;
  }
}

var today = DateTime.now();
print(today.isToday);
print(today.isWeekend);

九、总结 #

9.1 核心要点 #

要点 说明
类定义 class关键字,成员变量和方法
构造函数 默认、命名、工厂构造函数
继承 extends关键字,super调用
接口 implements关键字,隐式接口
混入 mixin关键字,with使用
扩展 extension关键字,添加功能

9.2 下一步 #

掌握了类与对象后,让我们继续学习 异步编程

最后更新:2026-03-28