Skip to content

Commit 9492c50

Browse files
Refresh _ru\tour\traits.md (#2790)
1 parent 6a07424 commit 9492c50

File tree

2 files changed

+104
-4
lines changed

2 files changed

+104
-4
lines changed

_ru/tour/traits.md

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,56 @@ prerequisite-knowledge: expressions, classes, generics, objects, companion-objec
1313
Трейты (Traits) используются, чтобы обмениваться между классами информацией о структуре и полях. Они похожи на интерфейсы из Java 8. Классы и объекты могут расширять трейты, но трейты не могут быть созданы и поэтому не имеют параметров.
1414

1515
## Объявление трейта
16+
1617
Минимальное объявление трейта - это просто ключевое слово `trait` и его имя:
1718

19+
{% tabs trait-hair-color %}
20+
{% tab 'Scala 2 и 3' for=trait-hair-color %}
21+
1822
```scala mdoc
1923
trait HairColor
2024
```
2125

26+
{% endtab %}
27+
{% endtabs %}
28+
2229
Трейты наиболее полезны в качестве обобщенного типа с абстрактными методами.
30+
31+
{% tabs trait-iterator-definition class=tabs-scala-version %}
32+
33+
{% tab 'Scala 2' for=trait-iterator-definition %}
34+
2335
```scala mdoc
2436
trait Iterator[A] {
2537
def hasNext: Boolean
2638
def next(): A
2739
}
2840
```
2941

42+
{% endtab %}
43+
44+
{% tab 'Scala 3' for=trait-iterator-definition %}
45+
46+
```scala
47+
trait Iterator[A]:
48+
def hasNext: Boolean
49+
def next(): A
50+
```
51+
52+
{% endtab %}
53+
54+
{% endtabs %}
55+
3056
При наследовании от трейта `Iterator[A]` требует указание типа `A` а также реализация методов `hasNext` и `next`.
3157

3258
## Использование трейтов
59+
3360
Чтобы использовать трейты, необходимо наследовать класс от него, используя ключевое слово `extends`. Затем необходимо реализовать все абстрактные члены трейта, используя ключевое слово `override`:
61+
62+
{% tabs trait-intiterator-definition class=tabs-scala-version %}
63+
64+
{% tab 'Scala 2' for=trait-intiterator-definition %}
65+
3466
```scala mdoc:nest
3567
trait Iterator[A] {
3668
def hasNext: Boolean
@@ -40,7 +72,7 @@ trait Iterator[A] {
4072
class IntIterator(to: Int) extends Iterator[Int] {
4173
private var current = 0
4274
override def hasNext: Boolean = current < to
43-
override def next(): Int = {
75+
override def next(): Int = {
4476
if (hasNext) {
4577
val t = current
4678
current += 1
@@ -49,15 +81,51 @@ class IntIterator(to: Int) extends Iterator[Int] {
4981
}
5082
}
5183

84+
val iterator = new IntIterator(10)
85+
iterator.next() // вернет 0
86+
iterator.next() // вернет 1
87+
```
88+
89+
{% endtab %}
90+
91+
{% tab 'Scala 3' for=trait-intiterator-definition %}
92+
93+
```scala
94+
trait Iterator[A]:
95+
def hasNext: Boolean
96+
def next(): A
97+
98+
class IntIterator(to: Int) extends Iterator[Int]:
99+
private var current = 0
100+
override def hasNext: Boolean = current < to
101+
override def next(): Int =
102+
if hasNext then
103+
val t = current
104+
current += 1
105+
t
106+
else
107+
0
108+
end IntIterator
52109

53110
val iterator = new IntIterator(10)
54111
iterator.next() // вернет 0
55112
iterator.next() // вернет 1
56113
```
114+
115+
{% endtab %}
116+
117+
{% endtabs %}
118+
57119
Этот класс `IntIterator` использует параметр `to` в качестве верхней границы. Он наследуется от `Iterator[Int]`, что означает, что метод `next` должен возвращать Int.
58120

59121
## Подтипы
60-
Туда, где требуется определенный тип трейта, мы можем передавать любой наследованный от требуемого трейта класс
122+
123+
Туда, где требуется определенный тип трейта, мы можем передавать любой наследованный от требуемого трейта класс
124+
125+
{% tabs trait-pet-example class=tabs-scala-version %}
126+
127+
{% tab 'Scala 2' for=trait-pet-example %}
128+
61129
```scala mdoc
62130
import scala.collection.mutable.ArrayBuffer
63131

@@ -76,4 +144,36 @@ animals.append(dog)
76144
animals.append(cat)
77145
animals.foreach(pet => println(pet.name)) // выведет "Harry" и "Sally"
78146
```
147+
148+
{% endtab %}
149+
150+
{% tab 'Scala 3' for=trait-pet-example %}
151+
152+
```scala
153+
import scala.collection.mutable.ArrayBuffer
154+
155+
trait Pet:
156+
val name: String
157+
158+
class Cat(val name: String) extends Pet
159+
class Dog(val name: String) extends Pet
160+
161+
val dog = Dog("Harry")
162+
val cat = Cat("Sally")
163+
164+
val animals = 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+
79174
У трейта `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)

_tour/traits.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,5 +161,5 @@ The `trait Pet` has an abstract field `name` that gets implemented by Cat and Do
161161

162162
## More resources
163163

164-
* Learn more about traits in the [Scala Book](/overviews/scala-book/traits-intro.html)
165-
* Use traits to define [Enum](/overviews/scala-book/enumerations-pizza-class.html)
164+
* Learn more about traits in the [Scala Book](/scala3/book/domain-modeling-tools.html#traits)
165+
* Use traits to define [Enum](/scala3/book/domain-modeling-fp.html#modeling-the-data)

0 commit comments

Comments
 (0)