Scala减少了继承中的重复代码

时间:2015-10-27 17:31:44

标签: scala inheritance

NPCFilter

我正在构建一些过滤数据的类。 PlayerFilterCharacterFilter应该共享.name("John").age(18).race(WHITE)中的方法。但是,我希望每个过滤器都在最后返回,以便我可以链接这样的函数: CharacterFilter

起初我尝试了这个,但它没有给出我想要的结果,因为在调用name而不是NPCFilter或{{1}后,我留下了PlayerFilter根据需要。

class CharacterFilter extends Filter[Character] {
    def name(n: String) = { data = data.filter(c => c.name == n); this }
}
class NPCFilter extends CharacterFilter {
}
class PlayerFilter extends CharacterFilter {
}

所以我的第一个例子完全符合我的要求,但它感觉重复(特别是一旦我添加了更多的功能)。有没有办法让它更简洁?

1 个答案:

答案 0 :(得分:4)

对于您返回this的特定情况,有直接支持:

def f(....) : this.type =  ....

写一下,this是唯一有效的返回值,编译器会在键入调用f的目标时键入它。

如果没有特定情况,如果您的返回类型与目标类型有某种关联,但不一定与this有关,则需要类型成员或通用,例如

abstract class A[T <: A[T]] {self: T =>
   def f(....): T
}

class B extends A[B] { ... }