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
Copy file name to clipboardExpand all lines: _ru/tour/generic-classes.md
+74-5Lines changed: 74 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -8,10 +8,16 @@ next-page: variances
8
8
previous-page: for-comprehensions
9
9
assumed-knowledge: classes unified-types
10
10
---
11
+
11
12
Обобщенные классы (Generic classes) - это классы, обладающие параметрическим полиморфизмом (т. е. классы, которые изменяют свое поведение в зависимости от приписываемого им типа. Этот тип указывается в квадратных скобках `[]` сразу после имени класса). Они особенно полезны для создания коллекций.
12
13
13
14
## Объявление обобщенного класса
15
+
14
16
Для объявления обобщенного класса необходимо после имени добавить тип в квадратных скобках `[]` как еще один параметр класса. По соглашению обычно используют заглавные буквы `A`, хотя можно использовать любые имена.
Данная реализация класса `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
+
classStack[A]:
40
+
privatevarelements:List[A] =Nil
41
+
defpush(x: A):Unit=
42
+
elements = x :: elements
43
+
defpeek:A= elements.head
44
+
defpop():A=
45
+
valcurrentTop= 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`.
29
56
30
57
## Использование
31
58
32
59
Чтобы использовать обобщенный класс, поместите конкретный тип в квадратные скобки вместо `A`.
Классы `Apple` и `Banana` наследуются от `Fruit` так, что мы можем засунуть экземпляры `Apple` и `Banana` в пачку `Fruit`.
54
123
55
124
_Примечание: подтипы обобщенных типов - *инвариантны*. Это означает, что если у нас есть стэк символов типа `Stack[Char]`, то он не может быть использован как стек интов типа `Stack[Int]`. Это нежелательное поведение, потому как позволило бы нам добавлять в стек символов целые числа. В заключение, `Stack[A]` является подтипом `Stack[B]` тогда и только тогда, когда `B = A`. Поскольку это может быть довольно строгим ограничением, Scala предлагает [механизм вариативного описания параметров типа](variances.html) для контроля за поведением подтипов._
0 commit comments