【Flutter】dart class、 mixin和extends、implements、with那些事

本文档基于dart 3.2.3, 于dart > 3.0 有效。本篇起源于大池子面试问题:extends implements、with 有啥区别。关于此问题,我想从class 和 mixin 开始,

1、class、mixin 常用修饰符

  • abstract
  • base
  • final
  • interface
  • sealed
  • mixin

2、abstract

2.1 抽象类的定义

abstract class Veichle {
  String egProps;
  void moveForward(int meters);

  Veichle(this.egProps) {
    print("Veichle Constructor $egProps");
  }
}

根据我们对OOP的理解,抽象类中的方法都是抽象方法,那么dart抽象类有如下特点

  • 抽象类是可以包含属性构造方法的。
  • 关于抽象类的属性,JJ的理解是声明了一个egPropsset抽象方法,由子类去负责实现。

2.2 extends

2.2.1 示例代码
void main(List<String> args) {
  Veichle veichle = Passat("帕萨特");
  veichle.moveForward(20);
}

abstract class Veichle {
  String brand;
  void moveForward(int meters);

  Veichle(this.brand) {
    print("Veichle Constructor $brand");
  }
}

class Passat extends Veichle {
  Passat(super.egProps) {
    print("Passt Constructor ${this.brand}");
  }

  
  void moveForward(int meters) {
    print("$brand has runed $meters");
  }
}

2.2.2 输出结果
Veichle Constructor 帕萨特
Passt Constructor 帕萨特
帕萨特 has runed 20
2.2.3 总结
  • class是可以extends(继承)抽象类的
  • 子类继承如果抽象类包含抽象方法(包含构造函数),extends是要全量实现抽象方法的。
  • 若抽象类包含构造方法, 子类实例对象构造的过程,是抽象类构造函数,子类构造函数

2.3 implements

2.3.1 事例代码

void main(List<String> args) {
  Veichle veichleAudi = Audi();
  veichleAudi.moveForward(20);
}
class Audi implements Veichle {
  
  String brand = "奥迪";

  
  void moveForward(int meters) {
    print("$brand has runed $meters m");
  }
}

因为implements 常用于对于接口(interface)的实现,故此处只实现了方法的重写。

  • @override 重载了抽象方法(包含属性的get方法)

2.3.2 输出结果

奥迪 has runed 20 m

2.3.3 小结

  • implements关键字只@override(重写)抽象方法(包含属性的set方法)
  • 因为不存在继承关系,故Audi实例话化程,与抽象类的默认构造函无关。

2.3 with

2.3.1 事例代码

void main(List<String> args) {
  Benz benz = Benz("奔驰");
  benz.moveForward(20);
}
abstract mixin class NonConstruction {
  void moveForward(int meters);
}
class Benz with NonConstruction {
  String brand;
  Benz(this.brand);
  
  void moveForward(int meters) {
    print("不塞车的$brand has runed $meters");
  }
}

2.3.2 输出结果

不塞车的奔驰 has runed 20

2.3.4 小结

值得注意的是,在使用with 关键字时(dart版本在开头已经强调,此处不再赘述),需要声明为mixin.

  • mixin混入的抽象类,是不能包含构造方法,时可以包含属性的。
  • mixin的类,是不能使用多态的,比如上述的Benz构造出的对象只是Benz类型。

3、base


TODO

  • 1.baseinterfacefinal之一sealed,描述对该类进行子类型化的其他库的限制。
  • 2. mixin

你可能感兴趣的:(Flutter,flutter)