第七章: Dart面向对象编程2 1. 本章概述 2. 继承 2.1 举个栗子 3. 继承中的构造方法 3.1 构造方法执行顺序 3.2 举个栗子 4. 抽象类
第七章: Dart面向对象编程2
- 1. 本章概述
- 2. 继承
- 2.1 举个栗子
- 3. 继承中的构造方法
- 3.1 构造方法执行顺序
- 3.2 举个栗子
- 4. 抽象类
- 4.1 举个栗子
- 5. 接口
- 5.1 举个栗子
- 6. Mixins
- 6.1 举个栗子
- 7. 操作符覆写
- 7.1 举个栗子
1. 本章概述
◆ 继承,继承中的构造方法
◆ 抽象类
◆ 接口
◆ Mixins,操作符的覆写
2. 继承
◆ 使用关键字extends继承一个类
◆ 子类会继承父类可见的属性和方法,不会继承构造方法
◆ 子类能够复写父类的方法、gettter和setter
◆ 单继承,多态性
2.1 举个栗子
class Person {int age = 10;
bool isAdult = false;
void run() {}
}
class Student extends Person {
void study() {
print("Student study. . .");
}
@override
bool get isAdult => age > 15;
@override
void run() {
print("Student run. . .");
}
}
3. 继承中的构造方法
◆ 子类的构造方法默认会调用父类的无名无参构造方法
◆ 如果父类没有无名无参构造方法,则需要显示调用父类构造方法
◆ 在构造方法参数后使用:显示调用父类构造方法
3.1 构造方法执行顺序
◆ 父类的构造方法在子类构造方法体开始执行的位置调用
◆ 如果有初始化列表,初始化列表会在父类构造方法之前执行
3.2 举个栗子
void main() {var student = new Student("Tom", "Male");
print(student.name);//Tom
}
class Person {
String? name;
Person(this.name);
Person.withName(this.name);
}
class Student extends Person {
int? age;
final String gender;
Student(String name, String g)
: gender = g,
super.withName(name);
}
4. 抽象类
◆ 抽象类使用abstract表示,不能直接被实例化
◆ 抽象方法不用abstract修饰,无实现
◆ 抽象类可以没有抽象方法
◆ 有抽象方法的类一定得声明为抽象类
4.1 举个栗子
void main() {var person = new Student ();
person.run();//run. . .
}
abstract class Person {
void run();
}
class Student extends Person {
@override
void run() {
print("run. . .");
}
}
5. 接口
◆ 类和接口是统- -的,类就是接口
◆ 每个类都隐式的定义了一个包含所有实例成员的接口
◆ 如果是复用已有类的实现,使用继承(extends)
◆ 如果只是使用已有类的外在行为,使用接口(implements)
5.1 举个栗子
class Person {String? name;
int get age => 18;
void run() {
print("Person run. . .");
}
}
class Student implements Person {
@override
String? name;
@override
int get age => 15;
@override
void run() {}
}
abstract class Person1 {
void run();
}
class Student1 implements Person1 {
@override
void run() {
print(" Student run. ..");
}
}
6. Mixins
◆ Mixins类似于多继承,是在多类继承中重用一个类代码的方式
◆ 作为Mixin的类不能有显示声明构造方法
◆ 作为Mixin的类只能继承自Object
◆ 使用关键字 with连接一个或多 个mixin
6.1 举个栗子
class A {void a() {
print("A.a() . . .");
}
}
class B {
void b() {
print("B.b() . . .");
}
}
class C {
void c() {
print("C.c() . . .");
}
}
class D extends A with B, C {}
abstract class Engine {
void work();
}
class OilEngine implements Engine {
@override
void work() {
print("Work with Oil. . .");
}
}
class ElectricEngine implements Engine {
@override
void work() {
print("Work with Electric. . .");
}
}
class Tyre {
String? name;
void run() {}
}
7. 操作符覆写
◆ 覆写操作符需要在类中定义
◆ 如果覆写==,还需要覆写对象的hashCode getter方法
7.1 举个栗子
void main() {var person1 = new Person(18);
var person2 = new Person(20);
print(person1 > person2);//false
person1.age;
print(person1['age']);//18
print(person1 == person2);//false
}
class Person {
int age;
Person(this.age);
bool operator >(Person person) {
return this.age > person.age;
}
int operator [](String str) {
if ("age" == str) {
return age;
}
return 0;
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Person && runtimeType == other.runtimeType && age == other.age;
@override
int get hashCode => age.hashCode;
}