Существует два способа определения метода для двух разных классов, наследующих одну и ту же черту в 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" }