这是我的Scala代码,我先将其粘贴
abstract class Item {
def price(): Double
def descript(): String
}
class SimpleItem(var price: Double, var descript: String) extends Item
class Bundle(price: Double, descript: String, var other: Item)
extends SimpleItem(price, descript) {
override def price = other.price + super.price
override def descript = "this item can contain other item,and now it's containning:"+
other.descript
}
在Bundle
的方法价格中,当我使用super.price
时,编译器认为我使用超类的私有属性,但当我将其更改为super.price()
时,现在编译器我认为我将()
添加到Double
。现在我很困惑:还有另一种方法来调用超类的方法吗?
答案 0 :(得分:4)
可悲的事实是,scala不允许你覆盖getter和var的setter。
这与统一访问原则相冲突(与您可以覆盖的val
对比),但您必须遵守此限制。
(有点难看)解决方法是自己定义一个getter和setter,如下所示:
class SimpleItem(private var _price: Double, private var _descript: String) extends Item{
def price = _price
def price_=( value: Double ) { _price = value }
def descript = _descript
def descript_=( value: String ) { _descript = value }
}
SimpleItem
在功能上仍然等同于你的orignal版本,你现在可以覆盖setter和getters(现在你的Bundle
类将按原样编译)。