Mixin vs继承

Joh*_*hnd 90 oop inheritance mixins

mixin和inheritance有什么区别?

Wil*_*ung 60

Mix in通常与多重继承一起使用.所以,从这个意义上说,"没有区别".

细节是Mix in很少用作独立对象.

例如,假设您有一个名为"ColorAndDimension"的混合名称,它会添加颜色属性以及宽度和高度.

现在,您可以将ColorAndDimension添加到,例如,Shape类,Sprite类,Car Class等.它们都将具有相同的接口(例如get/setColor,get/setHeight/Width等)

因此,在通用情况下,混合IS继承.但是你可以认为这是一个关于混合输入是一个"主要"类还是仅仅是混合类的整个领域中类的作用的问题.

编辑 - 只是为了澄清.

是的,在今天的现代术语中,可以考虑将Mix In视为具有相关实现的接口.它实际上只是简单,陈旧,日常的多重继承,使用普通的,老式的日常课程.它恰好是MI的特定应用.大多数语言都不提供混合在任何特殊状态下,它只是一个被设计为"混入"的类,而不是单独使用.


Aar*_*all 25

mixin和inheritance有什么区别?

一个混合式是一个基类,你可以继承,以提供额外的功能.名称"混合"表示它旨在与其他代码混合使用.因此,推断是您不会自己实例化混合类.混合常常与其他基类一起使用.因此,mixins是继承的子集或特例.

使用混合而不是单继承的优点是,您可以为函数编写一次代码,然后在多个不同的类中使用相同的功能.缺点是您可能需要在其他位置查找该功能,因此最好通过将其保持在附近来缓解该缺点.

我个人发现了在单个继承中使用必要的混合,我们正在对许多类似的代码进行单元测试,但测试用例是基于它们对基本案例的继承而实例化的,并且是保持代码关闭的唯一方法.在没有弄乱覆盖号的情况下,手(并且在同一模块中)是从对象继承,并且子例子继承自通用测试用例库和仅适用于它们的自定义基础.

Mixins在比较中与抽象基类相对比

两者都是父类的一种形式,不打算实例化.

一个混入提供的功能,但无法直接使用它.用户打算通过(子)类使用它.

一个抽象基类提供一个接口,但没有可用的功能.用户旨在创建接口调用的功能.

在Python中,super()模块中的一些类是父类的示例,它们都通过继承提供功能,而抽象接口则必须由子类实现.这些想法并不相互排斥.

摘要

简而言之,混合只是一个你不会自己实例化的基类,通常在多重继承中用作辅助基类.


Ale*_*lli 18

mix-in是用于实现目的的(多个)继承的特定,受限制的情况; 某些语言(例如Ruby)支持它而不支持广义多重继承.


Ale*_*lex 5

Mixin是一个抽象概念,任何符合其要求的东西都可以视为Mixin。

这是维基百科的定义。

在面向对象的编程语言中,mixin是一个类,其中包含供其他类使用的方法,而不必成为其他类的父类。这些其他类如何获得对mixin方法的访问取决于语言。混入有时被描述为“包含”而不是“继承”。

简而言之,与继承的主要区别在于,混入不需要像继承那样具有“是”关系。

从实现的角度来看,您可以将其视为实现的接口。例如,如果Java支持多重继承,则Java中的抽象类可以被视为mixin。