mixins和继承有什么区别?

Anv*_*han 17 oop scala

我试图在scala的上下文中理解Mixins.特别是我想知道继承概念和Mixins之间的区别.Wiki说mixins和inheritance的概念之间有重要的区别,因此我想理解它.

维基中Mixin的定义是:

mixin类充当父类,包含所需的功能.然后,子类可以继承或简单地重用此功能,但不能作为专业化的手段.通常,mixin会将所需的功能导出到子类,而不会创建严格的单个"是"关系.这里存在mixins和inheritance概念之间的重要区别,因为子类仍然可以继承父类的所有特性,但是,不必一定应用关于子元素"作为一种父类" 的语义.

在上面的定义中,我无法理解以粗体标出的语句.这是什么意思

  1. 子类可以在mixin中继承功能,但不能作为专业化的手段
  2. 在mixins中,子类继承了父类的所有特性,但是关于子元素的"语义",不一定要应用父类. - 孩子如何延伸父母而不一定是父母?有这样的例子吗?

提前感谢您对上述内容的任何澄清.

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 CommandoBridgePulseEngine; 但它它们,并获得这些特征中定义的方法.正如你所看到的,它一个Spacecraft,因为它继承自那个类.

值得一提的是,当a trait扩展a时class,如果你想制作某些with特性,它必须扩展该类.例如,如果我有一个class Dog,Dog with PulseEngine除非Dog延长,否则我无法拥有Spacecraft.这样,它就像添加方法一样; 然而,它仍然相似.

  • &gt; `在这种情况下,StarCruiser 不是 CommandoBridge 或 PulseEngine` 我真的不明白这是怎么回事,当我可以定义一个方法时,说 `launch(foo: CommandoBridge)` 并称之为 `launch(new) StarCruiser())`...不是能够将`StarCruiser` 的实例传递给期望`CommandoBridge` 的方法,这是表明`StartCruiser` 确实是*a* `CommandoBridge` 的规范示例吗? (2认同)

sud*_*d29 5

一个特点(被称为混入时与一类混合)就像是在Java中的接口(虽然有很多不同),您可以添加一个类的附加功能而不必“是一个”关系。或者可以说,特征通常捆绑了可以由多个独立类使用的功能。

为了让你从Scala库,一个例子有序[A]trait这对一些基本的比较操作提供了实现(如<<=>>=),以能够与自然顺序数据类。

例如,假设您有自己的类Number和子类EvenNumberOddNumber如下所示。

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)

在上面的示例中,类别EvenNumberOddNumber共享是与的关系,NumberEvenNumber不具有“是”的关系,而与Half都不是OddNumber共享“是”的关系Increment

另外重要的一点是,即使类Number用途extends Ordered的语法,这意味着Number有一个隐含的 是一个具有超关系OrderedAny