在scala

时间:2015-06-17 18:44:34

标签: scala oop composition accessor mutators

在scala中,它很容易覆盖默认的访问器和mutator;这让我对公共属性感觉更舒服,因为它允许我在以后修改访问行为而不改变我的类的签名。以下是这样做的:

class Topic {
  var tags = "default"; 
}

变为:

class Topic{
  private var _tags = "default"; 
  def tags = {
    _tags
  }
  def tags_ =(s:String){
    _tags = s
  }
}

但是,这并没有解决创建私有字段的主要原因;它不允许修改组件元素的行为。例如,对于Growable,如果我添加一个新元素或清除我的列表,我可能想做一些特别的事情。解决此问题的一种方法是创建一个实现Growable的类,例如:

class Topic {
  private var _tags:Growable[String] = new MyMutableList[String]() 
  def tags = {
    _tags
  }
  def tags_=(Growable[String]){
    _tags = m
  }
}
class MyMutableList[T] extends MutableList[T](){
    override def +=(t:T) {
      println("adding: " + t.toString())
      super.+=(t)
    }
    override def clear() {
      println("clearing")
      super.clear()
    }
}

然而,这并没有完全解决问题,因为'标签'仍然可以设置为任何Growable [String]。这会将clear()方法的行为改变为所提供的任何类型的行为。

无论如何都要覆盖属性的方法,就像覆盖属性的访问者/ mutator一样?这不会编译,但它表达了我尝试做的事情:

class Topic {
  private var _tags:Growable[String] = new MutableList[String](); 
  def tags = {
    _tags
  }
  def tags_=(m:Growable[String]){
    _tags = m
  }
  def tags_.+=(s:String) {
    println("adding: " + t.toString())
    _tags += s
  }
  def tags_.clear(){
    println("clearing")
    _tags.clear()
  }
}

1 个答案:

答案 0 :(得分:1)

您无法覆盖类中属性的方法。

  • 您可以限制tags属性的类型 无法将tags属性设置为其他属性 Growable[String}
  • 你也可以省略mutator方法并添加一个 addTag(tag: String): UnitcleanTags : Unit方法。