Skip to content

面向对象编程

Dart 是一门面向对象的编程语言,几乎所有事物都是对象,包括数字、函数和 null。在 Dart 中,类是构建对象的核心工具。

类与对象

定义类和实例化对象

  • 使用 class 关键字定义类。
  • 通过构造函数实例化对象。

示例:

dart
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void introduce() {
    print('Hi, I am $name, and I am $age years old.');
  }
}

void main() {
  var person = Person('Alice', 25);
  person.introduce(); // 输出: Hi, I am Alice, and I am 25 years old.
}

构造函数

默认构造函数

Dart 提供默认的无参构造函数,如果未定义任何构造函数,默认构造函数会自动生成。

示例:

dart
class Animal {
  String name = '';
}

命名构造函数

使用命名构造函数创建对象时,可以提供额外的灵活性。

示例:

dart
class Animal {
  String name;
  Animal.named(this.name);
}

void main() {
  var animal = Animal.named('Lion');
  print(animal.name); // 输出: Lion
}

重定向构造函数

一个构造函数可以将调用重定向到类中的另一个构造函数。

示例:

dart
class Point {
  int x, y;

  Point(this.x, this.y);

  Point.origin() : this(0, 0); // 重定向到主构造函数
}

工厂构造函数

工厂构造函数用 factory 声明,可返回现有对象而不是新对象。

示例:

dart
class Singleton {
  static final Singleton _instance = Singleton._internal();

  factory Singleton() {
    return _instance;
  }

  Singleton._internal(); // 私有构造函数
}

属性与方法

成员变量与方法

  • Dart 中成员变量和方法的默认可见性是 public
  • 使用 _ 定义私有成员。

Getter 和 Setter

使用 getset 自定义访问器。

示例:

dart
class Rectangle {
  int width, height;

  Rectangle(this.width, this.height);

  int get area => width * height; // 自定义 Getter
  set widthValue(int value) => width = value; // 自定义 Setter
}

this 关键字

用于引用当前实例的属性或方法。

示例:

dart
class Circle {
  double radius;

  Circle(this.radius);

  double get area => 3.14 * this.radius * this.radius; // 使用 this
}

继承

基本继承

使用 extends 关键字实现继承。

示例:

dart
class Animal {
  void eat() {
    print('Eating...');
  }
}

class Dog extends Animal {
  void bark() {
    print('Barking...');
  }
}

方法重写

使用 @override 注解重写父类方法。

示例:

dart
class Animal {
  void sound() {
    print('Animal sound');
  }
}

class Dog extends Animal {
  @override
  void sound() {
    print('Bark');
  }
}

super 关键字

调用父类的构造函数或方法。

示例:

dart
class Parent {
  void greet() => print('Hello from Parent');
}

class Child extends Parent {
  void greet() {
    super.greet(); // 调用父类方法
    print('Hello from Child');
  }
}

抽象类与接口

抽象类

使用 abstract 修饰,不能实例化。

示例:

dart
abstract class Shape {
  void draw(); // 抽象方法
}

class Circle extends Shape {
  @override
  void draw() {
    print('Drawing Circle');
  }
}

实现接口

使用 implements 实现多个接口。

示例:

dart
class Flyable {
  void fly();
}

class Bird implements Flyable {
  @override
  void fly() {
    print('Flying...');
  }
}

多接口实现

dart
class Swimmable {
  void swim();
}

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

  @override
  void swim() {
    print('Duck swimming');
  }
}

Mixin

定义和使用 Mixin

  • Mixin 是一种复用代码的方式,使用 mixin 关键字定义。
  • 使用 with 关键字混入到类中。
  • Mixin 不能有构造函数。
  • 如果多个 Mixin 有相同的方法,后面的 Mixin 会覆盖前面的。

示例:

dart
mixin Swimmable {
  void swim() => print('Swimming');
}

mixin Flyable {
  void fly() => print('Flying');
}

class Duck with Swimmable, Flyable {}

class Fish with Swimmable {}

Mixin 与多继承的区别

Mixin 更灵活且避免了传统多继承的复杂性。

枚举

枚举的定义与使用

使用 enum 定义枚举。

示例:

dart
enum Color { red, green, blue }

void main() {
  var color = Color.red;
  print(color); // 输出: Color.red
}

枚举的常见用法

遍历、比较。

dart
for (var color in Color.values) {
  print(color);
}
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!