文章

对象_类

对象/类

对象_类

对象/类

面向对象编程(OOP)的三个基本特征:封装、继承、多态

  • 封装:封装是对象和类概念的主要特性;封装 把客观事物封装成抽象的类,并且把自己的部分属性和方法提供其它
  • 继承:面向对象编程语言的一个
  • 多态:

Dart所有的东西都是对象,所有的对象都继承自Object类。

Dart是一门使用类和单继承的面相对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类

一个类通常由属性和方法组成。

创建类 使用类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 首字母大写
class Person {
  String name = '张三';
  int age = 20;

  void getInfo() {
    print('$name,$age');
    print('${this.name},${this.age}'); // 推荐
  }

  void setInfo(int age) {
    this.age = age;
  }
}

void main() {
  var p = new Person();
  print(p.name); // 张三
  p.getInfo();

  p.setInfo(28); // 张三,20

  p.getInfo(); // 张三,28
}

构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Person {
  String name = '张三';
  int age = 20;

  // 默认构造函数
  Person() {
    print('这是构造函数里面的内容 这个方法是在实例化的时候触发');
  }

  void getInfo() {
    print('$name,$age');
    print('${this.name},${this.age}');
  }
}

void main() {
  var p = new Person();
}

构造函数传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
  String name = '';
  int age = 20;

  // 默认构造函数
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

void main() {
  Person p = new Person('张三', 28);
  p.getInfo(); // 张三,28
}

默认构造函数**简写**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person {
  String name = '';
  int age = 20;

  // 默认构造函数 - 简化写法
  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

void main() {
  Person p = new Person('张三', 28);
  p.getInfo(); // 张三,28
}

命名构造函数

1
2
3
4
void main() {
  // 实例话 DateTime 调用它的命名构造函数
  var d = new DateTime.now();
}

Dart 里命名构造函数可以写多个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Person {
  String name = '';
  int age = 20;

  // 默认构造函数 - 简化写法
  Person(this.name, this.age);

  // 命名构造函数
  Person.now() {
    print('我是命名构造函数');
  }

  // 命名构造函数
  Person.setInfo(String name, int age) {
    this.name = name;
    this.age =age;
  }

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

void main() {
  Person p1 = new Person.now(); // 我是命名构造函数
  Person p2 = new Person.setInfo('张三', 20);
  p2.getInfo(); // 张三,20
}

把类单独抽离成一个模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person {
  String name = '';
  int age = 20;

  // 默认构造函数 - 简化写法
  Person(this.name, this.age);

  // 命名构造函数
  Person.now() {
    print('我是命名构造函数');
  }

  // 命名构造函数
  Person.setInfo(String name, int age) {
    this.name = name;
    this.age =age;
  }

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

引入

1
2
3
4
5
6
7
8
9
// 引入
import 'Person.dart';

void main() {
  // 使用
  Person p1 = new Person.now();
  Person p2 = new Person.setInfo('张三', 20);
  p2.getInfo();
}

私有属性

定义:使用 _ 把一个属性或者方法定义成私有的

必须是在一个单独的模块中才会生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
  String name = '';
  int _age = 20; // 私有属性

  // 默认构造函数 - 简化写法
  Person(this.name, this._age);

  void getInfo() {
    return this._age;
  }

  void _run() {
    print('这是一个私有方法');
  }

  execRun() {
    this._run(); // 类里面方法的相互调用
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 引入
import 'Person.dart';

void main() {
  Person p = new Person('张三', 28);
  // 报错 无法访问私有属性
  print(p.age);
  // 间接获取私有属性
  print(p.getInfo()); // 28

  p._run(); // 私有方法 无法访问
  // 间接调用私有方法
  p.execRun(); // 这是一个私有方法
}

类中的 getter 和 setter 修饰符

  • getter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Rect {
  num width = 0;
  num height = 0;

  Rect(this.width, this.height);

  get area {
    return this.width * this.height;
  }
}

void main() {
  Rect r = new Rect(10, 4);
  // 注意调用 直接通过访问属性的方式访问area
  var area = r.area;
  print(area); // 40
}
  • setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Rect {
  num width = 0;
  num height = 0;

  Rect(this.width, this.height);

  get area {
    return this.width * this.height;
  }

  set areaHeight(value) {
    this.height = value;
  }
}

void main() {
  Rect r = new Rect(10, 4);
  r.areaHeight = 6;
  var area = r.area;
  print(area); // 60
}

初始化实例变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Person {
  String name = '';
  int age = 20;

  // 先赋值 再初始化构造函数
  Person(): name = '张三', age = 28 {
    
  }

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

void main() {
  Person p = new Person();
  p.getInfo(); // 张三,28
}
本文由作者按照 CC BY 4.0 进行授权