gpt4 book ai didi

Scala:用 val 覆盖 def

转载 作者:行者123 更新时间:2023-12-02 06:17:22 25 4
gpt4 key购买 nike

考虑以下示例:

abstract class Item {
def price: Double
def description: String
}

class SimpleItem1(override val price: Double, override val description: String) extends Item{}
class SimpleItem2(val price: Double, val description: String) extends Item{}

它编译成功并且两个扩展类具有相同的方法。它们实际上是一样的吗?如果不是 - 有什么区别?如果是,请向我解释一下,例如:为什么他们决定在这里“覆盖”是可选的?

最佳答案

因为 pricedescriptionItem 中是抽象的,所以您不需要使用 override 修饰符。如果它们具有默认实现,则必须添加 override 修饰符。

因此,在 SimpleItem1 中,修饰符是多余的。在某些情况下,“以防万一”添加 override 是有意义的。例如,如果您定义一个特征,您可能希望将其混入具有默认实现的类中。


这是一个示例,其中 override 会有所作为:

trait Item0 {
def price: Int
}

trait Item1 extends Item0 {
def price = 33
}

trait Item2 extends Item0 {
override def price = 33
}

object Foo1 extends Item1 // ok
object Foo2 extends Item2 // ok
object Foo3 extends Item0 with Item1 // ok
object Foo4 extends Item2 with Item1 // NOPE!
object Foo4 extends Item1 with Item2 // aha!

一般情况下,您应该尽可能避免使用 override

关于Scala:用 val 覆盖 def,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com