2015-10-27 42 views
1
class CharacterFilter extends Filter[Character] { 
    def _name(n: String) = { data = data.filter(c => c.name == n) } 
} 
class NPCFilter extends CharacterFilter { 
    def name(n: String) = { _name(n); this } 
} 
class PlayerFilter extends CharacterFilter { 
    def name(n: String) = { _name(n); this } 
} 

我正在建立一些类,通过数据过滤。 NPCFilterPlayerFilter应共享CharacterFilter中的方法。不过,我想每一个过滤器,以在年底返回自己,这样我可以链接的功能是这样的: .name("John").age(18).race(WHITE)斯卡拉减少重复代码继承

起初,我想这一点,但它并没有给我想要的结果,因为我离开了CharacterFilter根据需要调用name而不是NPCFilterPlayerFilter。所以我的第一个例子完全按照我想要的方式工作,但它感觉重复(特别是一旦我添加更多的功能)。有没有办法让它更简洁?

回答

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] { ... } 
+0

的第一个片段很棒!我从来没有见过这个'T <:A [T]'语法。这是什么叫我可以做一些研究呢? – John

+0

方括号表示类型参数。所以A是一个泛型类,带有类型参数T. <:是一个子类型约束,(上界),这意味着T必须是A [T]的子类型。对于你的用例,this.type是要走的路。类型参数解决方案适用于更复杂的情况。 –