You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Трейты (Traits) используются, чтобы обмениваться между классами информацией о структуре и полях. Они похожи на интерфейсы из Java 8. Классы и объекты могут расширять трейты, но трейты не могут быть созданы и поэтому не имеют параметров.
14
14
15
15
## Объявление трейта
16
+
16
17
Минимальное объявление трейта - это просто ключевое слово `trait` и его имя:
17
18
19
+
{% tabs trait-hair-color %}
20
+
{% tab 'Scala 2 и 3' for=trait-hair-color %}
21
+
18
22
```scala mdoc
19
23
traitHairColor
20
24
```
21
25
26
+
{% endtab %}
27
+
{% endtabs %}
28
+
22
29
Трейты наиболее полезны в качестве обобщенного типа с абстрактными методами.
При наследовании от трейта `Iterator[A]` требует указание типа `A` а также реализация методов `hasNext` и `next`.
31
57
32
58
## Использование трейтов
59
+
33
60
Чтобы использовать трейты, необходимо наследовать класс от него, используя ключевое слово `extends`. Затем необходимо реализовать все абстрактные члены трейта, используя ключевое слово `override`:
Этот класс `IntIterator` использует параметр `to` в качестве верхней границы. Он наследуется от `Iterator[Int]`, что означает, что метод `next` должен возвращать Int.
58
120
59
121
## Подтипы
60
-
Туда, где требуется определенный тип трейта, мы можем передавать любой наследованный от требуемого трейта класс
122
+
123
+
Туда, где требуется определенный тип трейта, мы можем передавать любой наследованный от требуемого трейта класс
animals.foreach(pet => println(pet.name)) // выведет "Harry" и "Sally"
78
146
```
147
+
148
+
{% endtab %}
149
+
150
+
{% tab 'Scala 3' for=trait-pet-example %}
151
+
152
+
```scala
153
+
importscala.collection.mutable.ArrayBuffer
154
+
155
+
traitPet:
156
+
valname:String
157
+
158
+
classCat(valname:String) extendsPet
159
+
classDog(valname:String) extendsPet
160
+
161
+
valdog=Dog("Harry")
162
+
valcat=Cat("Sally")
163
+
164
+
valanimals=ArrayBuffer.empty[Pet]
165
+
animals.append(dog)
166
+
animals.append(cat)
167
+
animals.foreach(pet => println(pet.name)) // выведет "Harry" и "Sally"
168
+
```
169
+
170
+
{% endtab %}
171
+
172
+
{% endtabs %}
173
+
79
174
У трейта `Pet` есть абстрактное поле `name`, которое реализовано в классах `Cat` and `Dog`. В последней строке мы вызываем `pet.name`, который должен быть реализован в любом подтипе, унаследованном от трейта `Pet`.
175
+
176
+
## Дополнительные ресурсы
177
+
178
+
- Узнайте больше о трейтах в [Scala Book](/scala3/book/domain-modeling-tools.html#traits)
179
+
- Использование трейтов для определения [Enum](/scala3/book/domain-modeling-fp.html#modeling-the-data)
0 commit comments