dart小知识--迷信?

2019-08-05  本文已影响0人  RidingWind2023

相信看过flutter代码的小伙伴肯定都见过这个词, mixin , 迷信, 没想到堂堂google也有会汉语拼音的程序员。
但转念一想又不对啊,肯定有玄机。果不其然,是拆开念, mix , in。是dart为了解决多继承而设计的。

举一个例子,我们把才艺作为一项能力,书法、乐器、唱歌都是子能力。
我们把 人作为一个基类, 程序员、 销售作为子类,他们都可以自由组合才艺。
比如销售 会 乐器、唱歌, 程序员会书法,按照java 最传统的实现是如下结构 :

Mixin.png

这里有个问题是,程序员和销售都要实现一次唱歌这个接口中唱歌方法,尽管一模一样。
dart里面没有专门的接口关键字,但是类也可以作为接口来被实现,但是这么干和java没什么区别,那有没有办法把能力单独实现,而让程序员和销售都具备这种能力呢。答案就是Mixin。

Mixins

Mixin 是 一种解决方式,为了解决一个类的代码可以在多个类继承结构中复用。
由于dart是单继承的,mixin可以辅助来实现类似多继承的效果。

如何创建Mixin

要实现Mixin,首先要创建一个继承自Object的类,并不要声明构造函数,并用 mixin代替class关键字
(如果你想把这个类当做普通类来使用,也可以不用mixin关键字而使用class关键字)。样例如下:

mixin Ability {
  bool canSing = false;
  bool canWrite = false;
  bool canMusic = false;

  void entertainMe() {
    if (canSing) {
      print('canSing');
    } else if (canWrite) {
      print('canWrite');
    } else {
      print('canMusic');
    }
  }
}

如何使用mixin

使用with关键字, 后面可以跟 一个或者多个 mixin的类名,可以组合更多的能力。

class Person {
  String name;
  int age;

  Person(this.name, this.age);
}

class Engineer extends Person with Ability/*后面可以跟多个mixin*/ {
  Engineer(String name, int age) : super(name, age){
    canSing = true;
    canWrite = true;
  }
}

class Seller extends Person with Ability/*后面可以跟多个mixin*/ {
  Seller(String name, int age) : super(name, age){
    canSing = true;
    canMusic = true;
  }
}

上一篇下一篇

猜你喜欢

热点阅读