在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()
}
}但是,这并不能完全解决问题,因为“标记”仍然可以设置为任何GrowableString。这将将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()
}
}发布于 2015-06-17 19:12:06
不能覆盖类中属性的方法。
tags属性的类型,以便不可能将tags属性设置为不同的Growable[String}。addTag(tag: String): Unit和一个cleanTags : Unit方法。https://stackoverflow.com/questions/30899853
复制相似问题