我试图在scala的上下文中理解Mixins.特别是我想知道继承概念和Mixins之间的区别.Wiki说mixins和inheritance的概念之间有重要的区别,因此我想理解它.
维基中Mixin的定义是:
mixin类充当父类,包含所需的功能.然后,子类可以继承或简单地重用此功能,但不能作为专业化的手段.通常,mixin会将所需的功能导出到子类,而不会创建严格的单个"是"关系.这里存在mixins和inheritance概念之间的重要区别,因为子类仍然可以继承父类的所有特性,但是,不必一定应用关于子元素"作为一种父类" 的语义.
在上面的定义中,我无法理解以粗体标出的语句.这是什么意思
提前感谢您对上述内容的任何澄清.
Fun*_*uit 15
我不确定我是否正确地理解了你的问题,但是如果我这样做了,你会问一些东西如何能够继承,而不会像继承那样具有同样的意义.
但是,Mixins不是继承 - 它实际上更类似于动态地将一组方法添加到对象中.虽然继承说"这件事是另一件事",但是混合说,"这个对象有另外一些特征." 你可以在用于声明mixins的关键字中看到这个:trait.
从Scala主页上公然窃取一个例子:
abstract class Spacecraft {
def engage(): Unit
}
trait CommandoBridge extends Spacecraft {
def engage(): Unit = {
for (_ <- 1 to 3)
speedUp()
}
def speedUp(): Unit
}
trait PulseEngine extends Spacecraft {
val maxPulse: Int
var currentPulse: Int = 0
def speedUp(): Unit = {
if (currentPulse < maxPulse)
currentPulse += 1
}
}
class StarCruiser extends Spacecraft
with CommandoBridge
with PulseEngine {
val maxPulse = 200
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,StarCruiser不是a CommandoBridge或PulseEngine; 但它有它们,并获得这些特征中定义的方法.正如你所看到的,它是一个Spacecraft,因为它继承自那个类.
值得一提的是,当a trait扩展a时class,如果你想制作某些with特性,它必须扩展该类.例如,如果我有一个class Dog,Dog with PulseEngine除非Dog延长,否则我无法拥有Spacecraft.这样,它就像添加方法一样; 然而,它仍然相似.
一个特点(被称为混入时与一类混合)就像是在Java中的接口(虽然有很多不同),您可以添加一个类的附加功能而不必“是一个”关系。或者可以说,特征通常捆绑了可以由多个独立类使用的功能。
为了让你从Scala库,一个例子有序[A]是trait这对一些基本的比较操作提供了实现(如<,<=,>,>=),以能够与自然顺序数据类。
例如,假设您有自己的类Number和子类EvenNumber,OddNumber如下所示。
class Number(val num : Int) extends Ordered[Number] {
override def compare(that : Number) = this.num - that.num
}
trait Half extends Number {
def half() = num / 2
}
trait Increment extends Number {
def increment() = num + 1
}
class EvenNumber(val evenNum : Int) extends Number(evenNum) with Half
class OddNumber(val oddNum : Int) extends Number(oddNum) with Increment
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,类别EvenNumber和OddNumber共享是与的关系,Number但EvenNumber不具有“是”的关系,而与Half都不是OddNumber共享“是”的关系Increment。
另外重要的一点是,即使类Number用途extends Ordered的语法,这意味着Number有一个隐含的 是一个具有超关系Ordered即Any。