Различие между абстрактным классом и чертой [дубликат]

Возможный дубликат:
Черты Scala по сравнению с абстрактными классами

Каково концептуальное различие между абстрактными классами и чертами?

91
задан Community 23 May 2017 в 12:17
поделиться

4 ответа

Класс может только протягивает один суперкласс , и, таким образом, только один абстрактный класс. Если вы хотите составить несколько классов, Scala Way является использование состав класса Mixin : вы сочетаете (необязательно) Superclass, ваши собственные определения участника и один или несколько черт . Черта ограничена по сравнению с классами, в том, что он не может иметь параметры конструктора (сравните Справочное руководство Scala ).

Ограничения признаков по сравнению с классами вводятся, чтобы избежать типичных проблем с несколькими наследованием. Есть более или менее сложные правила в отношении иерархии наследования; Возможно, лучше избегать иерархии, где это на самом деле имеет значение. ;-) Насколько я понимаю, это может иметь значение, если вы наследуете два метода с одной и той же подписью / двумя переменными с тем же именем из двух разных черт.

70
ответ дан 24 November 2019 в 06:49
поделиться

Концептуально признак - это компонент класса, а не класс сам по себе. Как таковой, он обычно не имеет конструкторов и не предназначен для того, чтобы "стоять сам по себе".

Я предлагаю использовать абстрактный класс, когда он имеет самостоятельное значение, и черты, когда вы просто хотите добавить функциональность объектно-ориентированным образом. Если вы не уверены между двумя , вы можете обнаружить, что если все ваши методы вращаются вокруг того, чтобы делать одну вещь, вы, вероятно, хотите трейт.

Для (неязыкового) примера, если ваш сотрудник должен расширять и "Person" и "Cloneable", сделайте "Person" базовым классом, а "Cloneable" трейтом.

.
14
ответ дан 24 November 2019 в 06:49
поделиться

По крайней мере, в Scala, система признаков имеет явный способ объявления родительского приоритета в подклассе, чтобы избежать типичных проблем, связанных с множественным наследованием, т.е. конфликтов с наследственными методами, имеющими одну и ту же подпись.

Трейты похожи на Java-интерфейсы, но допускают реализацию методов.

5
ответ дан 24 November 2019 в 06:49
поделиться

Одним из аспектов признаков является то, что они представляют собой стек, который может быть сложен в стопку . Разрешение ограниченной формы 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 отражает линеаризацию иерархии наследования.

53
ответ дан 24 November 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: