有两种方法可以为继承 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" }