Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala减少继承中的重复代码_Scala_Inheritance - Fatal编程技术网

Scala减少继承中的重复代码

Scala减少继承中的重复代码,scala,inheritance,Scala,Inheritance,我正在构建一些过滤数据的类。NPCFilter和PlayerFilter应该共享CharacterFilter中的方法。但是,我希望每个过滤器在最后返回它们自己,以便我可以像这样链接函数: .姓名约翰18岁白人 起初我尝试了这个,但它没有给出我想要的结果,因为在调用name之后,我只剩下一个CharacterFilter,而不是NPCFilter或PlayerFilter class CharacterFilter extends Filter[Character] { def _nam

我正在构建一些过滤数据的类。NPCFilter和PlayerFilter应该共享CharacterFilter中的方法。但是,我希望每个过滤器在最后返回它们自己,以便我可以像这样链接函数: .姓名约翰18岁白人

起初我尝试了这个,但它没有给出我想要的结果,因为在调用name之后,我只剩下一个CharacterFilter,而不是NPCFilter或PlayerFilter

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

因此,我的第一个示例正是按照我所希望的方式工作的,但它感觉是重复的,尤其是当我添加更多函数时。有没有办法使它更简洁?

对于您返回此文件的特定情况,有一个直接的支持:

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 {
}
写这篇文章时,这是唯一有效的返回值,编译器将键入它,就像它键入调用f的目标一样

除此之外,如果您的返回类型在某种程度上与目标类型相关,但不一定是这样,那么您需要一个类型成员或泛型,例如

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

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

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 {
}
写这篇文章时,这是唯一有效的返回值,编译器将键入它,就像它键入调用f的目标一样

除此之外,如果您的返回类型在某种程度上与目标类型相关,但不一定是这样,那么您需要一个类型成员或泛型,例如

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

第一个片段非常有用!我从来没有见过这个T,方括号表示类型参数。因此A是一个泛型类,带有类型参数T。第一个代码段非常有用!我从来没有见过这个T,方括号表示类型参数。所以A是一个泛型类,带有类型参数T