Если вы пришли с Java, поначалу это может звучать странно (это было то же самое для меня), но на самом деле сейчас я нахожу более регулярный синтаксис, чем у Java, где мне нужно явно сказать, хочу ли я implement
или extend
другой класс / интерфейс. Но я думаю, что это больше вопрос личного вкуса.
На самом деле не имеет значения, говорите ли вы extends
или implements
. Они оба представляют один и тот же тип отношений между двумя вещами: представляет собой (в отличие от делегирования и композиции, которые представляют , имеет отношение ). Вот, например, вы можете найти дополнительную информацию об этом:
http://www.javacamp.org/moreclasses/oop/oop5.html
Просто попробуйте заменить extends
, implements
, with
на is a
, и это станет более понятным.
В Scala у вас также есть другие варианты отношения is a
. Например self types :
trait Bar {
self: Foo =>
// ...
}
При этом вы говорите, что Bar
не расширяет / не реализует Foo
напрямую, но все другие классы, которые хотят расширить Bar
, также должны расширять Foo
.
Самостоятельные типы могут позволять интересные вещи. Например, два класса / черты, которые зависят друг от друга:
class Bar extends Foo {
def sayHello(name: String) = println("Hello, " + name)
greet()
}
trait Foo {
this: Bar =>
def greet() = sayHello("User")
}
new Bar() // prints: Hello, User