Scala把方法放在特质或者案例中?
有两种方法可以在
Scala中为两个不同的类继承相同的特征定义一个方法.
sealed trait Z { def minus: String } case class A() extends Z { def minus = "a" } case class B() extends Z { def minus = "b" } 替代方案如下: sealed trait Z { def minus: String = this match { case A() => "a" case B() => "b" } case class A() extends Z case class B() extends Z 第一种方法重复方法名称,而第二种方法重复类名. sealed trait Z { def minus(word: Boolean = false): String = this match { case A() => if(word) "ant" else "a" case B() => if(word) "boat" else "b" } case class A() extends Z case class B() extends Z 这些做法有什么区别?如果我选择第二种方法,是否有任何错误等待着我? 编辑: sealed trait Z { def minus(word: Boolean): String ; def minus = minus(false) } case class A() extends Z { def minus(word: Boolean) = if(word) "ant" else "a" } case class B() extends Z { def minus(word: Boolean) = if(word) "boat" else "b" } 解决方法
我会选择第一个.
为什么只是保持开放/封闭原则. 的确,如果你想添加另一个子类,那么我们来看一下case C,你必须修改supertrait / superclass才能插入新的条件…丑陋 您的场景在Java中与模板/策略模式与条件类似. 更新: 在上一种情况下,您无法避免输入的“重复”.的确,Scala中的参数类型是不可推断的. 一个方法比混合整体更好的一个方法表现出与方法联合所期望的参数一样多. 想象一下你的超级方法的十个条件.如果你不经意地改变每个人的行为呢?每次更改都会有风险,而且每次修改超声波单元测试应始终运行… 此外,不经意地改变输入参数(不是行为)根本不是“危险的”.为什么?因为编译器会告诉您参数/参数类型不再相关. 正如这个link所解释的: 为什么开放原则是重要的:
更新2: 这里有一个避免输入重复的示例,符合您的期望: sealed trait Z { def minus(word: Boolean): String = if(word) whenWord else whenNotWord def whenWord: String def whenNotWord: String } case class A() extends Z { def whenWord = "ant"; def whenNotWord = "a"} 感谢类型推论:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |