模式切换
面向对象编程
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
使用 get
和 set
自定义访问器。
示例:
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);
}