首先,您应该注意到Mixin只存在于多继承语言中。您不能在Java或C#中执行混合操作。
基本上,Mixin是一个独立的基本类型,它为子类提供有限的功能和多态共振。如果您正在使用C#进行思考,请考虑一个您不必实际实现的接口,因为它已经实现了;您只需继承它并从它的功能中获益。
Mixins通常范围较窄,不打算扩展。
[编辑-为什么:]
既然你问我为什么。最大的好处是你不必自己一遍又一遍地做这件事。在C#中,混合器可能受益的最大地方是处置模式..每当您实现IDisposable时,您几乎总是希望遵循相同的模式,但是您最终会编写和重写相同的基本代码,并略有变化。如果有一个可扩展的处理混合,您可以节省大量额外的打字。
[编辑2-回答你的其他问题]
什么将混合和多重继承区分开来?这只是语义学的问题吗?
是。混合继承和标准多继承之间的区别仅仅是语义问题;具有多重继承的类可能会将混合作为该多重继承的一部分。
Mixin的目的是创建一个类型,该类型可以通过继承“混合”到任何其他类型,同时不影响继承类型,同时仍然为该类型提供一些有益的功能。
再一次,想想已经实现的接口。
我个人不使用混合语言,因为我主要是在一种不支持它们的语言中开发的,所以我很难想出一个很好的例子来提供“啊哈!”对你来说是时候了。但我会再试一次。我将使用一个人为的例子-大多数语言已经以某种方式提供了这个特性-但希望这能解释如何创建和使用Mixin。下面是:
假设您有一个类型,您希望能够在XML之间进行序列化。您希望类型提供一个“ToXML”方法,该方法返回一个字符串,该字符串包含带有该类型的数据值的XML片段,以及一个允许该类型从字符串中的XML片段中重构其数据值的“FromXML”。同样,这是一个精心设计的示例,因此您可能从语言的运行时库中使用文件流或XMLWriter类.随便吧。关键是您希望将对象序列化为XML,并从XML中获取一个新对象。
本例中的另一个重要点是,您希望以通用的方式进行此操作。您不希望为要序列化的每个类型实现“ToXML”和“FromXML”方法,您需要一些通用的方法来确保您的类型能够做到这一点,而且它只是有效的。你想要代码重用。
如果您的语言支持它,您可以创建XmlSerialableMixin来完成您的工作。这种类型将实现ToXML和FromXML方法。它将使用一些对示例不重要的机制,能够收集与其混合的任何类型的所有必要数据,以构建ToXML返回的XML片段,并且在调用FromXML时也同样能够恢复该数据。
还有.。就这样。要使用它,您需要从XmlSerialable继承任何需要序列化为XML的类型。每当需要序列化或反序列化该类型时,只需调用ToXML或FromXML。事实上,由于XmlSerialable是一种完全成熟的类型和多态类型,因此可以构建一个文档序列化程序,它不了解原始类型,只接受一个XmlSerialable类型数组。
现在,设想将此场景用于其他事情,比如创建一个混合体,以确保每个将其混合在日志中的类都能记录每个方法调用,或者创建一个用于向混合方法调用的类型提供事务性的Mixin。这份清单可以继续下去。
如果您只是认为一个混合器是一个小的基本类型,旨在添加少量的功能到一个类型,而不影响该类型,那么你是黄金。
但愿能去。*)