【问题标题】:Override attribute's methods in scala在scala中覆盖属性的方法
【发布时间】:2015-06-17 18:44:33
【问题描述】:

在 Scala 中,很容易覆盖默认的访问器和修改器;这让我对公共属性感觉更舒服,因为它允许我在以后修改访问行为而无需更改我的类的签名。这是如何完成的:

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()
    }
}

但是,这并不能完全解决问题,因为 'tags' 仍然可以设置为等于任何 Growable[String]。这会将 clear() 方法的行为更改为所提供的任何类型的行为。

是否可以像覆盖属性的访问器/修改器一样覆盖属性的方法?这不会编译,但它表达了我正在尝试做的事情:

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()
  }
}

【问题讨论】:

    标签: scala oop composition accessor mutators


    【解决方案1】:

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

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

    【讨论】:

    • 我想到的另外两种方法:1. 您可以将m 包装在setter(或getter,如cscan 所描绘的那样)中,并让包装对象(委托)重新定义clear+=。 2. 您可以使用反射覆盖tags-instance 的方法。后者可能最接近问题的要求。但是,考虑到良好的设计实践,您的第二点就是要走的路。
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 2010-09-27
    • 2015-02-25
    • 1970-01-01
    • 2013-01-15
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多