在scala中覆盖属性的方法
Override attribute's methods in scala
在 scala 中,覆盖默认访问器和修改器非常容易;这让我对 public 属性感觉更舒服,因为它允许我在以后修改访问行为而无需更改我的 class 的签名。这是如何完成的:
class Topic {
var tags = "default";
}
变成:
class Topic{
private var _tags = "default";
def tags = {
_tags
}
def tags_ =(s:String){
_tags = s
}
}
但是,这并没有解决创建私有字段的主要原因;它不允许修改组件元素的行为。例如,对于 Growable,如果我添加一个新元素或清除我的列表,我可能想做一些特别的事情。解决这个问题的一种方法是创建一个实现 Growable 的 class,例如:
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() 方法的行为更改为所提供的任何类型的行为。
有没有办法像覆盖属性的 accessor/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()
}
}
您不能覆盖 class 中属性的方法。
- 您可以限制
tags
属性的类型,使其成为
无法将 tags
属性设置为不同的
Growable[String}
。
- 您也可以省略 mutator 方法并添加一个
addTag(tag: String): Unit
和一个 cleanTags : Unit
方法。
在 scala 中,覆盖默认访问器和修改器非常容易;这让我对 public 属性感觉更舒服,因为它允许我在以后修改访问行为而无需更改我的 class 的签名。这是如何完成的:
class Topic {
var tags = "default";
}
变成:
class Topic{
private var _tags = "default";
def tags = {
_tags
}
def tags_ =(s:String){
_tags = s
}
}
但是,这并没有解决创建私有字段的主要原因;它不允许修改组件元素的行为。例如,对于 Growable,如果我添加一个新元素或清除我的列表,我可能想做一些特别的事情。解决这个问题的一种方法是创建一个实现 Growable 的 class,例如:
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() 方法的行为更改为所提供的任何类型的行为。
有没有办法像覆盖属性的 accessor/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()
}
}
您不能覆盖 class 中属性的方法。
- 您可以限制
tags
属性的类型,使其成为 无法将tags
属性设置为不同的Growable[String}
。 - 您也可以省略 mutator 方法并添加一个
addTag(tag: String): Unit
和一个cleanTags : Unit
方法。