深入理解Dart之Mixins

在面向对象的世界中,我们最熟悉的莫过于classabstract classinterface。Dart作为一门现代面向对象编程语言,在原有的特性基础上,新增了一些新的特性,今天我们就来聊聊 Mixins

什么是Mixins

在官方文档中,我们可以看到对Mixins的解释是:

Mixins are a way of reusing a class’s code in multiple class hierarchies.

简单的理解,就是用来复用多个类之间的代码,减少耦合。我们直接来看一个例子。

没有Mixins的从前

假设,我们现在正在开发一个动物大全App,我们需要创建一个Duck类。作为一个有丰富面向对象编程经验的开发者,你自然的将所有和Duck有相似特征的抽取成一个abstract class。

/// Bird
abstract class Bird {
    void shout() {
        println('shouting');
    }
}

/// WaterborneBird
abstract class WaterborneBird extends Bird {
    void swim() {
        println('swimming');
    }
}

/// Duck
class Duck extends WaterborneBird {
    void doDuckThings() {
        shout();
        swim();
        println('quack quack quack!')
    }
}

很好,我们清楚的将鸭子归入水中生活的鸟类,加入其它的鸟类也变得非常容易。但是,现在我们需要加入金鱼了,于是我们和上面一样编写代码。

/// Fish
abstract class Fish {
    void swim() {
        println("swimming")
    }
}

/// GoldFish
class GoldFish extends Fish {
    void doGoldFishThings() {
        swim();
        pringln('zzz...');
    }
}

这是我们发现金鱼和鸭子一样拥有swim的特性,在这个例子中是非常简单的,但是如果我们有复杂的行为需要赋予给一个新的类,我们就要大量编写重复的代码了。

使用Mixins

我们声明一个Swimming的mixin:

mixin Swimming {
    void swim() {
        println('swimming')
    }
}

我们可以使用with关键字将mixin加入到class中,其实看到这里你可能已经回想到我们其实可能已经用过这个with关键字了。接下来,我们就可以对上面的代码进行改造了:

/// Bird
abstract class Bird {
    void shout() {
        println('shouting');
    }
}


/// Duck
class Duck extends Bird with Swimming {
    void doDuckThings() {
        shout();
        swim();
        println('quack quack quack!')
    }
}

/// Fish
abstract class Fish {

}

/// GoldFish
class GoldFish extends Fish with Swimming {
    void doGoldFishThings() {
        swim();
        pringln('zzz...');
    }
}

另外,你可以将多个mixins放入同一个类中,而且dart对这个数量没有作任何限制。

其它

关于Mixins,还有很多需要注意的事情,我们虽然可以使用Mixins对代码进行一些简化,但是要建立在对需求和类之间的关系准确理解的基础上。建议多去看看Flutter中使用Mixins实现的一些源码,从里面吸取一些正确的经验。



作者:Jotyy
链接:https://www.jianshu.com/p/06604077d843
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(android)