1

这是我的 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
}

在方法 price 中Bundle,当我使用 时super.price,编译器认为我使用了超类的私有属性,但是当我将其更改为 时super.price(),现在编译器认为我添加()Double. 现在我很困惑:还有其他方法可以调用超类的方法吗?

4

1 回答 1

4

可悲的事实是,scala 不允许您覆盖 var 的 getter 或 setter。这与统一访问原则相冲突(并与val可以覆盖的 s 形成对比),但您必须接受此限制。

一个(有点丑陋的)解决方法是自己定义一个 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在功能上仍然等同于您的原始版本,您现在可以覆盖 setter 和 getter(现在您的Bundle类将按原样编译)。

于 2013-07-23T11:08:08.190 回答