Catalogue   

隐式接口

每一个类都隐式地定义了一个接口并实现了该接口,这个接口包含所有这个类的实例成员以及这个类所实现的其它接口。如果想要创建一个 A 类支持调用 B 类的 API 且不想继承 B 类,则可以实现 B 类的接口。

扩展一个类

使用 extends 关键字来创建一个子类,并可使用 super 关键字引用一个父类:

重写类成员

子类可以重写父类的实例方法(包括 操作符)、 Getter 以及 Setter 方法。你可以使用 @override 注解来表示你重写了一个成员:

1
2
3
4
5
6
7
8
9
10
class Television {
// ···
set contrast(int value) {...}
}

class SmartTelevision extends Television {
@override
set contrast(num value) {...}
// ···
}

noSuchMethod

如果调用了对象上不存在的方法或实例变量将会触发 noSuchMethod 方法,你可以重写 noSuchMethod 方法来追踪和记录这一行为:

只有下面其中一个条件成立时,你才能调用一个未实现的方法:

  • 接收方是静态的 dynamic 类型。
  • 接收方具有静态类型,定义了未实现的方法(抽象亦可),并且接收方的动态类型实现了 noSuchMethod 方法且具体的实现与 Object 中的不同。

扩展方法

扩展方法是向现有库添加功能的一种方式。跟kotlin的扩展方法效果一样。

1
2
3
4
5
import 'string_apis.dart';
...
print('42'.padLeft(5)); // Use a String method.
print('42'.parseInt()); // Use an extension method.

可调用类

通过实现类的 call() 方法,允许使用类似函数调用的方式来使用该类的实例。

1
2
3
4
5
6
7
8
class WannabeFunction {
String call(String a, String b, String c) => '$a $b $c!';
}

var wf = WannabeFunction();
var out = wf('Hi', 'there,', 'gang');

void main() => print(out);

抽象类

  • 抽象类不能被实例化;
  • 使用abstract修饰;
  • 抽象方法不需要使用abstract,没有实现体即可,用分号结束;

Dart中,extends只能继承一个类。没有interface关键字,可以把抽象类当成接口使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// 抽象类
abstract class Animal{
late String name; //数据
void display(){ //普通函数
print("名字是:${name}");
}
/// 可以不用abstract修饰
void eat(); //抽象函数
}

class Dog extends Animal{
/// 实现抽象方法
@override
void eat() { //实现抽象函数
print("eat");
}
}

函数重写

1
2
3
4
5
6
7
8
9
10
11
12
13
class Animal {
late String name;
void run() {
print('run');
}
}

class Tiger extends Animal {
@Override
void run() {
print('Tiger run');
}
}

使用Override修饰符,函数名字相同。