混合 mixin with
在Dart语言开发中,混合与扩展是常用的语言特性: mixin 一种特殊的类,对方可以不用成为其子类,而直接复用其方法。
使用场景:通用实现抽类,将通用逻辑封装到mixin类中,可以拥有该逻辑的类可以随时混入进去,而不用每次都重新实现,可以达到类似多继承的结果
特点:
- 不能有构造函数
- 不能继承
- 可限制只能在某些类的子类中使用
定义方法:mixin 类名{ }
例子:
比如我们有个Driver类,里面有个dirve()方法
mixin Driver{
void drive(){
print("drive");
}
}
然后再定义一个Drive类,混合Driver
class Drive with Driver{
}
然后我们去调用
void main(List<String> args) {
Drive drive=new Drive();
drive.drive();
}
new关键字可以省略
打印结果
G:\AndroidWorkSpace\flutter_learn\lib\mix\mixin.dart
drive
可以看出 Drive类就有了Driver类中得dirve方法。
特点介绍: 1不能有构造函数 比如
我们将Driver类声明一个构造函数,编译器给出错误,说 Mixin类不能声明构造函数
2,不能继承
定义一个Person类,让Driver去继承Person,可以看到编译器报错了。
扩展函数
不破坏原有类的基础上,对原有类进行扩展的一种手段,即非侵入式的方法扩展方式,在实际开发中非常有价值。
如何定义扩展函数
extension ExtensionName on ClassName {
// 添加方法和功能
}
其中,ExtensionName是我们自定义的扩展名称,
ClassName是要扩展的类名。通过在Extension内部定义方法和功能
比如我们对一个Stirng进行扩展:
extension StringExtension on String {
String capitalize() {
if (isEmpty) {
return this;
}
return substring(0, 1).toUpperCase() + substring(1);
}
}
将首字母进行大写的扩展函数
调用
void main(List<String> args){
String str="hello world";
print(str.capitalize());
}
还一种情况,比如我们定义两个扩展函数,但是扩展函数的名称是一样的,我们怎么调用呢?
extension StringExtension on String {
String capitalize() {
if (isEmpty) {
return this;
}
return substring(0, 1).toUpperCase() + substring(1);
}
}
extension StringExtension1 on String {
String capitalize() {
if (isEmpty) {
return this;
}
return substring(0, 2).toUpperCase() + substring(1);
}
}
1,如果两个方法是写在同一个文件中的,那么可以如下调用:
void main(List<String> args){
String str="hello world";
// StringExtension(str).capitalize();
print(StringExtension(str).capitalize());
print(StringExtension1(str).capitalize());
}
方便理解:extension StringExtension on String
我们可以将extension关键字后面的 StringExtension 当做一个类名,然后将要调用的str当做参数传入进来StringExtension(str) 然后去调用里面的方法。