一、继承
- 子类使用 extends 关键词来继承父类。
- 子类会继承父类里可见的属性和方法(包括getter和setter);但不会继承父类的构造函数。
- super 可以调用父类的构造函数和方法。
- 子类能复写父类的 方法、getter 和 setter。
- 复写父类方法时:@override(末尾没有分号) 可写可不写,但是建议写上,方便阅读。
// 父类
class Rect {
num width;
num height;
Rect(this.width, this.height);
void set setheight(int value) {
this.height = value;
}
num get area {
return this.width * this.height;
}
}
// 子类
class Cube extends Rect {
num deep;
// NOTICE: width和height使用父类构造器初始化,而deep使用子类自己的构造器初始化。
Cube(num width, num height, this.deep) : super(width, height);
// Cube(num width, num height, this.deep) : super.xxx(width, height);
@override
num get area {
return this.width * this.height * this.deep;
}
}
void main() {
Cube c1 = new Cube(3, 4, 5);
print("体积:${c1.area}");
}
mixins实现类似多继承 - with
在Dart中使用mixins实现类似多继承的功能。 条件一直在变花,以下是基于Dart2.x中使用mixins的条件:
- 作为mixins的类只能继承自Object,不能继承其他类:如A和B不能继承
- 作为mixins的类不能有构造函数:如A和B不能由构造器
- 一个类可以mixins多个mixins类:如C可以mixins类A和B
- mixins绝不是继承,也不是接口,而是一种全新的特性。当然你可以理解为 类似多继承.
- mixins的类型就是其超类的子类型
class A {
String aName = 'this is A';
void printA()=> print(aName);
}
class B {
String bName = 'this is B';
void printB()=> print(bName);
}
// mixins A和B
class C with A,B {}
// class C extends A with B {} // 继承A;mixins B (A就没有mixins的约束)
void main() {
C c1 = new C();
print("A: ${c1.aName} -- B: ${c1.bName}");
print(c1 is A);// true
print(c1 is B);// true
print(c1 is C);// true
}
二、抽象类
抽象类就只是制定了一个标准的模具,不能当成实际产品使用。— 定义标准
- 抽象类用 abstract 关键字声明
- 抽象类中:用abstract修饰的属性是抽象属性;没有方法体的方法是抽象方法。没有构造函数(因此不能实例化)
- 子类继承抽象类必须实现抽象类中的抽象方法;抽象类作为接口使用的时候必须实现所有的属性和方法。 — VS Code 快速修复… (Ctrl+.)
extends继承抽象类
复用抽象类的里的方法,并且要用抽象方法约束子类。
abstract class Phone {
void call();
void playGame();
}
class Huawei extends Phone {
String name;
String processor;
Huawei(this.name, this.processor);
@override
call() {
// TODO: implement call
throw UnimplementedError();
}
@override
playGame() {
// TODO: implement playGame
throw UnimplementedError();
}
}
void main() {
Huawei h1 = new Huawei('huawei', '麒麟9000');
print(h1.name);
}
implements实现接口
把抽象类当做标准:属性和方法
- 没有interface关键字定义接口;而是普通类或抽象类都可以作为接口被实现;使用implements关键字进行实现。
- 实现:
- 如果实现的是普通类:会将普通类和抽象类中的属性和方法全部复写;
- 建议使用抽象类定义接口;
abstract class DB {
abstract String name;
abstract String username;
abstract String password;
abstract String port;
void add();
void edit();
}
class MySQL implements DB {
@override
String name;
@override
String port;
@override
String username;
@override
String password;
MySQL(this.name, this.port, this.username, this.password);
@override
void add() {
// TODO: implement add
}
@override
void edit() {
// TODO: implement edit
}
}
void main() {
MySQL m1 = new MySQL('mysql', '3306', 'root', 'root');
print(m1.name);
}
implements实现多个接口
满足所有接口的要求即可
abstract class DBData {
abstract String name;
abstract String username;
abstract String password;
abstract String port;
}
abstract class DBMethods {
void add();
void edit();
}
class MySQL implements DBData,DBMethods {
@override
String name;
@override
String port;
@override
String username;
@override
String password;
MySQL(this.name, this.port, this.username, this.password);
@override
void add() {
// TODO: implement add
}
@override
void edit() {
// TODO: implement edit
}
}
void main() {
MySQL m1 = new MySQL('mysql', '3306', 'root', 'root');
print(m1.name);
}