首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中覆盖属性的方法

在scala中覆盖属性的方法
EN

Stack Overflow用户
提问于 2015-06-17 18:44:33
回答 1查看 425关注 0票数 1

在scala中,很容易重写默认的访问器和变异器;这使我对公共属性感到更舒服,因为它允许我在以后修改访问行为,而无需更改类的签名。这是如何做到的:

代码语言:javascript
复制
class Topic {
  var tags = "default"; 
}

变成:

代码语言:javascript
复制
class Topic{
  private var _tags = "default"; 
  def tags = {
    _tags
  }
  def tags_ =(s:String){
    _tags = s
  }
}

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

代码语言:javascript
复制
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()
    }
}

但是,这并不能完全解决问题,因为“标记”仍然可以设置为任何GrowableString。这将将clear()方法的行为更改为所提供的任何类型的行为。

是否有类似于可以重写属性的访问器/变量的方法来覆盖属性的方法?这不是编译,但它表达了我想要做的事情:

代码语言:javascript
复制
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()
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-17 19:12:06

不能覆盖类中属性的方法。

  • 您可以限制tags属性的类型,以便不可能将tags属性设置为不同的Growable[String}
  • 您还可以省略mutator方法并添加一个addTag(tag: String): Unit和一个cleanTags : Unit方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30899853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档