随着Dart
学习的深入,发现了一个比较棘手的语法——mixin
。它对于Java
开发人员来说,是一个全新的概念,但也是深入学习Dart
无法绕过的一个槛。
那么mixin
到底是什么尼???下面来看维基百科对它的定义。
mixin
是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin
类的方法、变量而不必成为其子类。
简而言之,mixins
是普通的类,我们可以从中扩展方法(或变量)而不扩展类。
应用场景
首先我们来看一个应用场景。
在上图中,有一个类——Animal
,它有三个子类——Mammal
、Bird
及Fish
,而这三个类也有其对应的子类。
下面分别通过Java
及Dart
来实现上面这些类及其继承关系。
Java
代码
//Java代码
public class Animal {...}
public class Mammal extends Animal {...}
public class Bird extends Animal {...}
public class Fish extends Animal {...}
public class Dolphin extends Mammal {...}
public class Bat extends Mammal {...}
public class Cat extends Mammal {...}
public class Dove extends Bird {...}
public class Duck extends Bird {...}
public class Shark extends Fish {...}
public class FlyingFish extends Fish {...}
Dart
代码
//Dart代码
class Animal {...}
class Mammal extends Animal {...}
class Bird extends Animal {...}
class Fish extends Animal {...}
class Dolphin extends Mammal {...}
class Bat extends Mammal {...}
class Cat extends Mammal {...}
class Dove extends Bird {...}
class Duck extends Bird {...}
class Shark extends Fish {...}
class FlyingFish extends Fish {...}
代码几乎一摸一样,下面就根据上图来分别给这些类添加行为——Walk
,Swim
及Flying
。由于这些行为并不是所有类通用的,所以不能将这些行为放在父类。但如果把这三个行为分别放在三个类中,然后让其他类来继承这三个类,也就可以解决上述问题。但这样就是多继承,而Java
及Dart
又不支持多继承。所以这时候凸显出接口的重要性,通过接口来实现上述行为。代码如下:
//行走行为
public interface Walk {
void walk();
}
//游泳行为
public interface Swim {
void swim();
}
//飞翔行为
public interface Flying {
void flying();
}
//海豚可以游泳
public class Dolphin extends Mammal implements Swim {
@Override
public void swim() {
...}
}
//蝙蝠可以飞、行走
public class