加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – mixins和继承有什么区别?

发布时间:2020-12-16 19:02:31 所属栏目:安全 来源:网络整理
导读:我试图在 scala的背景下了解Mixins.特别是我想知道继承概念和Mixins的区别.维基说,mixins和继承的概念有重要的区别,因此我想了解它. Mixin在wiki中的定义说: mixin类作为父类,包含所需的功能.然后,一个子类可以继承或简单地重用此功能,但不能作为专业化的手
我试图在 scala的背景下了解Mixins.特别是我想知道继承概念和Mixins的区别.维基说,mixins和继承的概念有重要的区别,因此我想了解它.

Mixin在wiki中的定义说:

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

在上述定义中,我无法理解粗体字.这是什么意思

>一个子类可以继承mixin中的功能,但不能作为专业化的手段
>在mixins中,孩子继承父类的所有功能,但是关于孩子“是一种”的语义不需要一定应用父进程. – 一个孩子如何延伸父母,而不一定是父母?有这样的例子吗?

预先感谢上述的任何澄清.

解决方法

我不知道我是否正确地理解了你的问题,但是如果我这样做,你会问一些事情可以继承而没有真正意义上的继承.

但是,Mixins不是继承的 – 它实际上更像是将一组方法动态添加到对象中.而继承说“这是另一回事”,mixins说:“这个对象有一些这样的特征.”您可以在关键字中看到这一点,用于声明mixins:trait.

公然从斯卡拉主页窃取一个例子:

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
}

在这种情况下,StarCruiser不是CommandoBridge或PulseEngine;然而,它有它们,并获得了这些特征中定义的方法.它是一个航天器,正如你可以看到的,因为它从该类继承.

值得一提的是,当一个特征扩展一个类时,如果你想要创建一些具有这个特征的东西,它必须扩展该类.例如,如果我有一个狗狗,我不能有一个狗与PulseEngine,除非狗扩展航天器.这样做不太像添加方法;然而,它仍然是类似的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读