热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scala中的特征是接口还是抽象类?

如何解决《Scala中的特征是接口还是抽象类?》经验,为你挑选了1个好方法。

我已经通过互联网阅读了Scala中的Traits

可以提供具体成员的接口

这意味着,traits是接口,我们可以为接口中的方法提供body.我在这里有一个简单的查询,如果这可能比我的下面的代码显示错误的原因:

错误:(6,8)对象Car继承冲突成员:trait中的方法startEngine类型=>单位和方法startEngine in type => Unit单位(注意:这可以通过在对象Car中声明覆盖来解决).对象汽车用汽车扩展车辆{

trait Vehical {
  def startEngine : Unit = {
    println("Vehical Start")
  }
  def stopEngine
}

trait Motor {
  def startEngine : Unit = {
    println("Motor Start")
  }
  def stopEngine
}

object Car extends Vehical with Motor {

  override def stopEngine : Unit = {
    println("Stop Engine")
  }

  def main(args: Array[String]): Unit = {
    Car.startEngine
    Car.stopEngine
  }
}

作为一个java开发人员,我不会在界面中提供body,但scala traits允许这样做.如果traits不是接口,那么我会将它们视为抽象类,这意味着scala中不允许使用接口.

另请告诉我如何解决这个歧义问题.如果多个特征中有相同的方法,我如何在子类中使用我的startEngine方法.



1> Yuval Itzcha..:

作为一个java开发人员,我不会在界面中提供body,但scala traits允许这样做

Scala中的特性提供了定义默认实现的方法,Java启动版本8也是如此.在Scala中,它们主要用作mixins.

关于编译错误,这是因为你已经声明了两个VehicleMotor一个startEngine方法,并且从编译器的角度来看,这会产生歧义,因为你在两个实现中混合.要克服这个问题,您需要显式覆盖实现类/特征中的方法:

override def startEngine: Unit = super.startEngine

需要注意的一件重要事情是,super这里指的是mixin链中提供startEngine方法的最后一个特征,在这种情况下Motor.这意味着你会看到:

Motor Start
Stop Engine

我认为这不是你想要的.

可以做的是要求使用自我类型实现Vehicle混合:Motor

trait Vehicle {
  self: Motor =>

  def startEngine: Unit = {
    println("Vehicle Start")
    startMotor
  }

  def stopEngine: Unit = {
    println("Stopping Engine")
    stopMotor
  }
}

并且Motor仅根据电机定义您的方法:

trait Motor {
  def startMotor: Unit = {
    println("Motor Start")
  }

  def stopMotor: Unit = {
    println("Stop Motor")
  }
}

然后你混合所有东西:

object Car extends Vehicle with Motor

并致电:

def main(args: Array[String]): Unit = {
  Car.startEngine
  Car.stopEngine
}

你得到:

Vehicle Start
Motor Start
Stopping Engine
Stop Motor


推荐阅读
author-avatar
62755
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有