面向对象编程
- 面向对象编程(OPP)的三大基本特征是:封装、继承、多态
- 封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用,而一部分属性和方法则隐藏。
- 继承:面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
- 多态:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
- Dart所有的东西都是对象,所有的对象都继承自Object类
- Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类
- 一个类通常由属性和方法组成
void main() {
List list = new List();
list.isEmpty;
list.add('香蕉');
list.add('苹果');
Map m = new Map();
m.isEmpty;
m.isNotEmpty;
m["name"] = "张三";
m.addAll({"age": 20});
}
Dart中自定义类
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() {
Person p1 = new Person();
print(p1.name);
print(p1.age);
p1.setInfo(30);
p1.getInfo();
}
Dart中的构造函数
class Person {
String? name;
int? age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
void getInfo() {
print('姓名:$name,年龄:$age');
print('${this.name}----${this.age}');
}
void setInfo(int age) {
this.age = age;
}
}
void main() {
Person p1 = new Person('张三', 20);
print(p1.name);
print(p1.age);
p1.setInfo(30);
p1.getInfo();
}
Dart中的命名构造函数
class Person {
String? name;
int? age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
Person.now() {
print('我是命名构造函数');
}
void getInfo() {
print('姓名:$name,年龄:$age');
print('${this.name}----${this.age}');
}
void setInfo(int age) {
this.age = age;
}
}
void main() {
Person p1 = new Person('张三', 20);
print(p1.name);
print(p1.age);
p1.setInfo(30);
p1.getInfo();
Person p2 = new Person.now();
}
私有属性和私有方法
- Dart和其他面向对象语言不一样,Dart中没有public、private、protected这些访问修饰符但是我们可以使用_把一个属性或者方法定义成私有
- 私有方法,私有属性只能在当前类中使用,子类不能使用
class Animal {
String _name = '小狗';
int age = 20;
void _run() {
print('这是一个私有方法');
}
void execRun() {
this._run();
}
}
void main() {
Animal a = new Animal();
print(a.age);
a.execRun();
}
Dart类中的getter和setter修饰符
- Dart中的getter和setter修饰符,我们可以通过它来设置属性的值和取属性的值
- Dart中设置属性的值和取属性的值的时候,我们可以添加逻辑操作
- 使用getter和setter修饰符的时候,属性名不能和方法名相同
class Rect {
num? height;
num? width;
Rect(this.height, this.width);
get area {
return this.height! * this.width!;
}
set setWidth(value) {
this.width = value;
}
set setHeight(value) {
this.height = value;
}
}
void main() {
Rect r = new Rect(10, 4);
print(r.area);
r.setWidth = 6;
r.setHeight = 8;
print(r.area);
}
Dart中的初始化列表
- 初始化列表会在构造方法体执行之前执行
- 使用逗号分隔初始化表达式
class Rect {
num height;
num width;
Rect(): height = 2, width = 3 {
print('${this.height}----${this.width}');
}
get area {
return this.height * this.width;
}
}
void main() {
Rect r = new Rect();
print(r.area);
}