20

在 Effective Java 的第 93-4 页,我遇到了mixin一词。但我发现很难想象 mixin 到底是什么。有人可以通过提供Java中的mixin示例来帮助我吗?

4

3 回答 3

22

您指的是Effective Java - Prefer interfaces to abstract classes 的第 18 条,我特别相信以下部分:

接口是定义 mixin 的理想选择。简单地说,mixin是一个类除了它的“主要类型”之外还可以实现的一种类型,以声明它提供了一些可选的行为。例如Comparable,一个 mixin 接口允许一个类声明它的实例相对于其他相互比较的对象是有序的。这样的接口称为 mixin,因为它允许将可选功能“混入”到类型的主要功能中。抽象类不能用于定义 mixin,原因与它们不能被改装到现有类上的原因相同:一个类不能有多个父类,并且在类层次结构中没有合理的位置来插入 mixin。

本质上,在抽象类和接口中指定功能之间的主要区别之一是接口版本可以在许多不同的类层次结构中使用,而抽象类只能在一个类层次结构树中使用,因为 Java只允许单继承。

于 2013-08-01T08:08:56.247 回答
7

在 java 中没有混合这样的东西,因为没有办法将一段代码添加到单独的层次结构中的类中。这样做需要多重继承或至少 Scala 类型特征。

于 2013-08-01T07:44:44.597 回答
4

在“Effective Java”的范围内,只是在逻辑上提到它,没有具体的 Java 实现。例如,一个 Comparable 接口。它不会改变你的课堂目的或混淆你的 api 用户。它只是混合了用于排序和比较的功能。因此,在 Java 上下文中,我会将其缩小为装饰器模式。

混合的另一种变化可能如下。假设,你有:

interface IMyInterface
{
    public void doStuff();
}

class MyClass implements IMyInterface
{
    public void doStuff(){};
}

现在我们想要“混合”一些额外的功能。我们添加一个抽象类:

abstract class AbstractMixInProvider
{
    public abstract void doMixinStuff();
}

我们从 AbstractMixInProvider 扩展 MyClass:

class MyClass extends AbstractMixInProvider implements IMyInterface
{
    public void doStuff(){};
    public void doMixinStuff();
}

但是,正如我上面提到的,试图将混合概念引入 Java 看起来很丑,因为它只是在玩文字游戏。

于 2013-08-01T08:06:40.097 回答