最近在学习 Dart2 ,接触到 Mixin 只有理解它的设计初衷,才能更好的使用它来设计我们的应用程序。
以下内容摘要与维基百科:
Mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类。[1]Mixin有时被称作"included"而不是"inherited"。mixin为使用它的class提供额外的功能,但自身却不单独使用(不能单独生成实例对象,属于抽象类)。因为有以上限制,Mixin类通常作为功能模块使用,在需要该功能时“混入”,而且不会使类的关系变得复杂。用户与Mixin不是“is-a”的关系,而是“-able”关系
Mixin有利于代码复用[2]又避免了多继承的复杂。[3][4]使用Mixin享有单一继承的单纯性和多重继承的共有性。接口与mixin相同的地方是都可以多继承,不同的地方在于mixin是带实现的。Mixin也可以看作是带实现的interface。这种设计模式实现了依赖反转原则。[5]
综上所述,基本可以理解:Mixin 是实现组合关系的方式。
上面再次,提到 “依赖反转” SOLD 设计原则之一,这里顺带温故了一遍:
在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。
该原则规定:
- 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
- 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。
该原则颠倒了一部分人对于面向对象设计的认识方式。如高层次和低层次对象都应该依赖于相同的抽象接口。
一图胜千言:
上述内容也是摘录于维基
依赖反转网上一堆说法,有些还会和 控制反转 一起描述,个人觉得这些都弄得晦涩难懂,比不上维基的清晰明了,通俗易懂。
什么是高层次模块?什么是低层次模块?
任何软件都是硬件和人类的桥梁,从这个角度来说,软件设计中,越靠近人类这一端的就是高层次模块,越靠近计算机的就是低层次模块。
以移动开发的角度来说,产品的需求就是高层次模块,移动系统提供的 SDK 功能就是低层次模块。