作者:62755 | 来源:互联网 | 2023-01-19 04:01
我已经通过互联网阅读了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.
关于编译错误,这是因为你已经声明了两个Vehicle
和Motor
一个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