Flutter中extends、implements、mixins、extension使用场景解析

1,354 阅读2分钟

extends是继承可以继承父类的特性。

  • Dart中继承是单继承.
  • 构造函数或者析构函数不能继承.
  • 子类重写父类方法要在方法前加@override.
  • 子类调用父类的方法用super.
  • Dart中子类可以访问父类的所有变量和方法. 2371647917780_.pic.jpg

mixin可以不通过继承获得一个类的能力类似组合

  • 通过混入mixins的方式,可以把一个类的方法或者属性混入到另外一个类中,供其使用.

接口与实现 (implements)

  • 实现某个接口,接口中的所有方法和成员变量必须都进行实现.

扩展 (extension)

  • 在Dart 2.7 版本中,Dart新加入了一个重要的语法功能,叫做extension。Extension的主要功能给已经存在的类添加新的member function,往里面增加新的函数。通过extension, 我们可以向诸如 Iterable, String 这样的常用类里面增加一些方便的函数。

使用场景一览

关键字解决什么问题使用场景限制
Extend子类继承子类继承父类可以有构造方法和实例变量
Mixin(with)实现类似多继承不通过继承获得一个类的能力不能有构造方法,可以有实例变量
Extension(on)给系统类【例如String类添加功能】在无法修改被扩展类源码的情况下不能有构造方法和实例变量
Implement声明和实现的解耦模版方法的实现【设计模式的一种】暂无

一次性看懂使用场景


abstract class ClassBase{
  void doAction();
}

class MyClassA {
  String name;
  String age;
  MyClassA(this.name, this.age);
  void doMyClassA() {
    print('MyClassA.doMyClassA name:$name age:$age');
  }
}
///下面的MyClassB、MyClassC、MyClassD、MyClassE,不管用class还是mixin修饰,
///本质上都是mixin,都不可以添加构造函数,可以添加实例变量
class MyClassB {
  String classBName = "classBName";
  void doMyClassB() {
    print('MyClassB.doMyClassB');
  }
}
///implements来实现抽象类
class MyClassC implements ClassBase{
  void doMyClassC() {
    print('MyClassC.doMyClassC');
  }

  @override
  void doAction() {
    print('MyClassC.doAction');
  }
}
///extends来继承并实现抽象类
class MyClassD extends ClassBase{
  void doMyClassD() {
    print('MyClassD.doMyClassD');
  }

  @override
  void doAction() {
    print('MyClassD.doAction');
  }

}

mixin MyClassE implements ClassBase{
  void doMyClassE() {
    print('MyClassA.doMyClassE');
  }
}

///extension 无需修改MyClass 的源码,就可以给MyClass 添加功能
extension MyClassExtension on MyClass{
  // 不能添加实例变量,Extensions can't declare instance fields
  // String extensionName = "";
  void doMyClassExtension(){
    print('doMyClassExtension');
  }
}

///Dart 语言支持多继承【extends,with】实现多继承
///The class 'MyClassA' can't be used as a mixin because it declares a constructor.
///class MyClass extends MyClassB with MyClassA, MyClassC, MyClassD, MyClassE
class MyClass extends MyClassA with MyClassB, MyClassC, MyClassD, MyClassE {
  MyClass(String name, String age) : super(name, age);

  ///父类重写子类的方法
  @override
  void doMyClassE() {
    // TODO: implement doMyClassE
    super.doMyClassE();
    print('Rewrite MyClass.doMyClassE Method');
  }

  @override
  void myClassDoAction() {
    ///通过mixin with实现类似多继承的特性,调用多个"子类"的方法
    doMyClassA();
    doMyClassB();
    doMyClassC();
    doMyClassD();
    doMyClassE();
    ///调用extension扩展方法
    doMyClassExtension();
    ///调用抽象类 模版方法 【implement和extend实现】
    doAction();
  }
}

MyClass("Neo", "22").myClassDoAction();
flutter: MyClassA.doMyClassA name:Neo age:22
flutter: MyClassB.doMyClassB
flutter: MyClassC.doMyClassC
flutter: MyClassD.doMyClassD
flutter: MyClassA.doMyClassE
flutter: Rewrite MyClass.doMyClassE Method
flutter: doMyClassExtension
flutter: MyClassD.doAction