理解mixin

什么是mixin?

In object-oriented programming languages, a Mixin is a class that contains methods for use by other classes without having to be the parent class of those other classes. How those other classes gain access to the mixin’s methods depends on the language. Mixins are sometimes described as being “included” rather than “inherited”.

Mixin即mix in,混入的意思。
和多重继承类似,但通常混入Mixin的类和Mixin类本身不是is-a的关系,混入Mixin类是为了添加某些(可选的)功能。

自由地混入Mixin类就可以灵活地为被混入的类添加不同的功能。

传统的接口并不包含实现,而Mixin包含实现。实际上Mixin的作用和Java中的众多以able结尾的接口很相似。不同的是Mixin提供了(默认)实现,而 Java 中实现了able接口的类需要类自身来实现这些混入的功能(Serializable 接口是个例外)。

为了解决多重继承的问题,Java引入了接口 (interface)技术,Lisp、Ruby引入了 Mix-in 技术。

mix-in 是一个行为的集合,而这个行为可以被加到任意class里,然而在一些情况下,使用mix-in的类,需要满足一些协议(contract)。和接口的不同点,有两个。1. 如果有协议(contract)的话,协议是被声明在mix-in的文件内的。也就是说,更容易复用。2. 接口,不包括如何实现。而mix-in是关于如何容易地重用实现的。

个人理解mixin目的是增强类,不管是通过多继承还是其他组合方式。感觉有点像Yii2的behavior。

各语言的实现

php如何实现mixin

1
2
3
4
5
trait C {
}
class A extends B {
use C;
}

scala如何实现mixin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract class A {
val message: String
}
class B extends A {
val message = "I'm an instance of class B"
}
trait C extends A {
def loudMessage = message.toUpperCase()
}
class D extends B with C

val d = new D
println(d.message) // I'm an instance of class B
println(d.loudMessage) // I'M AN INSTANCE OF CLASS B

参考

您的支持将鼓励我继续创作 笔芯