关于在scala中调用超类方法的困惑

时间:2013-07-23 10:48:37

标签: java scala

这是我的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。现在我很困惑:还有另一种方法来调用超类的方法吗?

1 个答案:

答案 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类将按原样编译)。