Skip to content

Commit cd240a8

Browse files
Update generic-classes.md in russian (#2856)
1 parent 1ebe208 commit cd240a8

File tree

1 file changed

+74
-5
lines changed

1 file changed

+74
-5
lines changed

_ru/tour/generic-classes.md

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@ next-page: variances
88
previous-page: for-comprehensions
99
assumed-knowledge: classes unified-types
1010
---
11+
1112
Обобщенные классы (Generic classes) - это классы, обладающие параметрическим полиморфизмом (т. е. классы, которые изменяют свое поведение в зависимости от приписываемого им типа. Этот тип указывается в квадратных скобках `[]` сразу после имени класса). Они особенно полезны для создания коллекций.
1213

1314
## Объявление обобщенного класса
15+
1416
Для объявления обобщенного класса необходимо после имени добавить тип в квадратных скобках `[]` как еще один параметр класса. По соглашению обычно используют заглавные буквы `A`, хотя можно использовать любые имена.
17+
18+
{% tabs generic-classes-1 class=tabs-scala-version %}
19+
{% tab 'Scala 2' for=generic-classes-1 %}
20+
1521
```scala mdoc
1622
class Stack[A] {
1723
private var elements: List[A] = Nil
@@ -25,20 +31,64 @@ class Stack[A] {
2531
}
2632
}
2733
```
28-
Данная реализация класса `Stack` принимает в качестве параметра любой тип `A`. Это означает что список, `var elements: List[A] = Nil`, может хранить только элементы типа `A`. Процедура `def push` принимает только объекты типа `A` (примечание: `elements = x :: elements` переназначает `elements` в новый список, созданный путем добавления `x`а к текущим `elements`).
34+
35+
{% endtab %}
36+
{% tab 'Scala 3' for=generic-classes-1 %}
37+
38+
```scala
39+
class Stack[A]:
40+
private var elements: List[A] = Nil
41+
def push(x: A): Unit =
42+
elements = x :: elements
43+
def peek: A = elements.head
44+
def pop(): A =
45+
val currentTop = peek
46+
elements = elements.tail
47+
currentTop
48+
```
49+
50+
{% endtab %}
51+
{% endtabs %}
52+
53+
Данная реализация класса `Stack` принимает в качестве параметра любой тип `A`. Это означает что список, `var elements: List[A] = Nil`, может хранить только элементы типа `A`. Процедура `def push` принимает только объекты типа `A` (примечание: `elements = x :: elements` переназначает `elements` в новый список, созданный путем добавления `x` к текущим `elements`).
54+
55+
Здесь `Nil` — это пустой `List`, и его не следует путать с `null`.
2956

3057
## Использование
3158

3259
Чтобы использовать обобщенный класс, поместите конкретный тип в квадратные скобки вместо `A`.
33-
```
60+
61+
{% tabs generic-classes-2 class=tabs-scala-version %}
62+
{% tab 'Scala 2' for=generic-classes-2 %}
63+
64+
```scala mdoc
3465
val stack = new Stack[Int]
3566
stack.push(1)
3667
stack.push(2)
37-
println(stack.pop) // выведет 2
38-
println(stack.pop) // выведет 1
68+
println(stack.pop()) // выведет 2
69+
println(stack.pop()) // выведет 1
3970
```
40-
Экземпляр `stack` может принимать только Intы. Однако, если тип имеет подтипы, то они также могут быть приняты:
71+
72+
{% endtab %}
73+
{% tab 'Scala 3' for=generic-classes-2 %}
74+
75+
```scala
76+
val stack = Stack[Int]
77+
stack.push(1)
78+
stack.push(2)
79+
println(stack.pop()) // выведет 2
80+
println(stack.pop()) // выведет 1
4181
```
82+
83+
{% endtab %}
84+
{% endtabs %}
85+
86+
Экземпляр `stack` может принимать элементы типа `Int`. Однако, если тип имеет подтипы, то они также могут быть приняты:
87+
88+
{% tabs generic-classes-3 class=tabs-scala-version %}
89+
{% tab 'Scala 2' for=generic-classes-3 %}
90+
91+
```scala mdoc:nest
4292
class Fruit
4393
class Apple extends Fruit
4494
class Banana extends Fruit
@@ -50,6 +100,25 @@ val banana = new Banana
50100
stack.push(apple)
51101
stack.push(banana)
52102
```
103+
104+
{% endtab %}
105+
{% tab 'Scala 3' for=generic-classes-3 %}
106+
107+
```scala
108+
class Fruit
109+
class Apple extends Fruit
110+
class Banana extends Fruit
111+
112+
val stack = Stack[Fruit]
113+
val apple = Apple()
114+
val banana = Banana()
115+
116+
stack.push(apple)
117+
stack.push(banana)
118+
```
119+
120+
{% endtab %}
121+
{% endtabs %}
53122
Классы `Apple` и `Banana` наследуются от `Fruit` так, что мы можем засунуть экземпляры `Apple` и `Banana` в пачку `Fruit`.
54123

55124
_Примечание: подтипы обобщенных типов - *инвариантны*. Это означает, что если у нас есть стэк символов типа `Stack[Char]`, то он не может быть использован как стек интов типа `Stack[Int]`. Это нежелательное поведение, потому как позволило бы нам добавлять в стек символов целые числа. В заключение, `Stack[A]` является подтипом `Stack[B]` тогда и только тогда, когда `B = A`. Поскольку это может быть довольно строгим ограничением, Scala предлагает [механизм вариативного описания параметров типа](variances.html) для контроля за поведением подтипов._

0 commit comments

Comments
 (0)