美文网首页
深入理解Dart之Mixins

深入理解Dart之Mixins

作者: Jotyy | 来源:发表于2020-01-10 09:47 被阅读0次

    在面向对象的世界中,我们最熟悉的莫过于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实现的一些源码,从里面吸取一些正确的经验。

    相关文章

      网友评论

          本文标题:深入理解Dart之Mixins

          本文链接:https://www.haomeiwen.com/subject/wrlpactx.html