dart 混合与扩展

102 阅读2分钟

混合 mixin with

在Dart语言开发中,混合与扩展是常用的语言特性: mixin 一种特殊的类,对方可以不用成为其子类,而直接复用其方法。

使用场景:通用实现抽类,将通用逻辑封装到mixin类中,可以拥有该逻辑的类可以随时混入进去,而不用每次都重新实现,可以达到类似多继承的结果

特点:

  1. 不能有构造函数
  2. 不能继承
  3. 可限制只能在某些类的子类中使用

定义方法: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不能有构造函数 比如

image.png

我们将Driver类声明一个构造函数,编译器给出错误,说 Mixin类不能声明构造函数

2,不能继承

image.png

定义一个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) 然后去调用里面的方法。