Возможный дубликат:
Черты Scala по сравнению с абстрактными классамиКаково концептуальное различие между абстрактными классами и чертами?
Класс может только протягивает один суперкласс , и, таким образом, только один абстрактный класс. Если вы хотите составить несколько классов, Scala Way является использование состав класса Mixin : вы сочетаете (необязательно) Superclass, ваши собственные определения участника и один или несколько черт . Черта ограничена по сравнению с классами, в том, что он не может иметь параметры конструктора (сравните Справочное руководство Scala ).
Ограничения признаков по сравнению с классами вводятся, чтобы избежать типичных проблем с несколькими наследованием. Есть более или менее сложные правила в отношении иерархии наследования; Возможно, лучше избегать иерархии, где это на самом деле имеет значение. ;-) Насколько я понимаю, это может иметь значение, если вы наследуете два метода с одной и той же подписью / двумя переменными с тем же именем из двух разных черт.
Концептуально признак - это компонент класса, а не класс сам по себе. Как таковой, он обычно не имеет конструкторов и не предназначен для того, чтобы "стоять сам по себе".
Я предлагаю использовать абстрактный класс, когда он имеет самостоятельное значение, и черты, когда вы просто хотите добавить функциональность объектно-ориентированным образом. Если вы не уверены между двумя , вы можете обнаружить, что если все ваши методы вращаются вокруг того, чтобы делать одну вещь, вы, вероятно, хотите трейт.
Для (неязыкового) примера, если ваш сотрудник должен расширять и "Person" и "Cloneable", сделайте "Person" базовым классом, а "Cloneable" трейтом.
.По крайней мере, в Scala, система признаков имеет явный способ объявления родительского приоритета в подклассе, чтобы избежать типичных проблем, связанных с множественным наследованием, т.е. конфликтов с наследственными методами, имеющими одну и ту же подпись.
Трейты похожи на Java-интерфейсы, но допускают реализацию методов.
Одним из аспектов признаков является то, что они представляют собой стек, который может быть сложен в стопку . Разрешение ограниченной формы AOP (вокруг рекомендации).
trait A{
def a = 1
}
trait X extends A{
override def a = {
println("X")
super.a
}
}
trait Y extends A{
override def a = {
println("Y")
super.a
}
}
scala> val xy = new AnyRef with X with Y
xy: java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1
scala> val yx = new AnyRef with Y with X
yx: java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1
Разрешение super
отражает линеаризацию иерархии наследования.