Dart 中 extends, implements, mixin 的应用和区别

习惯了 JS 的编程方式,在学习 Dart 时,总是被这种纯面向对象编程中的概念搞的云里雾里,这篇博客总结了 Dart 中 extends , implements 和 mixin 的区别。

抽象类 和 继承

在面向对象的语言中任何一个抽象类都是不可以直接实例化的,只能用来继承。在 Dart 中可以使用 ‘abstract’ 关键字定义一个抽象类,并且抽象类中的方法可以省略方法体:

[你可以在 DartPad 中实践并学习Dart]

AnotherAbstractClass 同样是一个抽象类,他继承了 AbstractClass 并且没有覆写父类的所有方法,

当你使用非抽象类类继承一个抽象类时,必须使用 @override 覆写抽象类中的方法(不必覆写所有)并保证方法名称一致。

 当你使用 extends 继承一个抽象类时没有必要覆写抽象类中所有的方法, 但是抽象类中的 getter 和 setter 是必须覆写的 。

 

接口 interface 

在 Dart 中 没有专门的 interface 去创建一个接口,一般是用抽象类创建接口,任何类都可以引用一个或多个接口。

 使用接口,必须覆写父类中的每一个方法,这条规则是区别于继承的。当然了各个非抽象类也可以当作子类的接口,但是这样做完全没有必要,

为了保证一定的规范和代码的整洁,一般只用抽象类作为接口(抽象类中可以省略方法体,单纯定义方法签名),同时 Dart 支持了多接口。

 为什么使用接口而不是使用继承呢 ?

继承只能扩展一个类,但是接口可以实现扩展到多个类。如果目标是构建一个类来提供模拟多个类的API,接口正好合适,否则你应该使用继承。----摘自弗兰克《Flutter》实践。

 

Mixin 混入

Mixin 用于类之间相同逻辑代码段的抽离,使用 with 关键字声明一个 Mixin。

 一个类可以有无限个mixin ,只要这个类关联了某个 mixin ,便可以访问到 mixin 中所有的方法和属性。

当你想限制某个 mixin 只能用于某个类的子类时,可以使用 ‘on’ 关键字定义 mixin:

 

 看到这里想必你已心中有数,总结一下

继承 ---- extends 

  • 典型的面向对象的继承,用于扩展父类;
  • class B extends A { } ,  不强制覆写每一个父类中的方法(getter,setter 必须覆写);
  • 在 Dart 只能继承一个类

接口 ---- interface

  • 当你不想提供方法的实现而只想提供它们的 API 时,使用接口;
  • class C implements B { },你必须覆写B中所有的方法;
  • implements 可以扩展到多个类

混入 ---- mixin

  • 共享相同逻辑的代码段;
  • class B with A { }, 在B中你可以使用A的所有方法,可以通过 on 关键字限制 mixin 的使用范围;
  • with 可以扩展到多个 mixin

posted on 2022-04-28 18:45  Deflect-o-Bot  阅读(1179)  评论(0编辑  收藏  举报