Skip to content

Commit 6a07424

Browse files
Refresh _ru/tour/classes.md (#2782)
1 parent 441d8a9 commit 6a07424

File tree

2 files changed

+203
-19
lines changed

2 files changed

+203
-19
lines changed

_ru/tour/classes.md

Lines changed: 201 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,41 @@ prerequisite-knowledge: no-return-keyword, type-declaration-syntax, string-inter
1313
Классы в Scala являются основами для создания объектов. Они могут содержать методы, константы, переменные, типы, объекты, трейты и классы, которые в совокупности называются _членами_. Типы, объекты и трейты будут рассмотрены позже в ходе нашего обзора.
1414

1515
## Объявление класса
16+
1617
Минимальное объявление класса - это просто ключевое слово `class` и его имя. Имена классов должны быть написаны с заглавной буквы.
18+
19+
{% tabs class-minimal-user class=tabs-scala-version %}
20+
21+
{% tab 'Scala 2' for=class-minimal-user %}
22+
1723
```scala mdoc
1824
class User
1925

2026
val user1 = new User
2127
```
22-
Ключевое слово `new` используется для создания экземпляра класса. `User` имеет конструктор по умолчанию, который не принимает аргументов, так как конструктор не был определен. Однако обычно используется и конструктор, и тело класса. Пример объявления класса Point приведен ниже:
28+
29+
Ключевое слово `new` используется для создания экземпляра класса.
30+
{% endtab %}
31+
32+
{% tab 'Scala 3' for=class-minimal-user %}
33+
34+
```scala
35+
class User
36+
37+
val user1 = User()
38+
```
39+
40+
Чтобы создать экземпляр класса, мы вызываем его как функцию: `User()`.
41+
Также можно явно использовать ключевое слово `new`: `new User()` - хотя обычно это опускается.
42+
{% endtab %}
43+
44+
{% endtabs %}
45+
46+
`User` имеет конструктор по умолчанию, который не принимает аргументов, так как конструктор не был определен. Однако обычно используется и конструктор, и тело класса. Пример объявления класса Point приведен ниже:
47+
48+
{% tabs class-point-example class=tabs-scala-version %}
49+
50+
{% tab 'Scala 2' for=class-point-example %}
2351

2452
```scala mdoc
2553
class Point(var x: Int, var y: Int) {
@@ -34,72 +62,228 @@ class Point(var x: Int, var y: Int) {
3462
}
3563

3664
val point1 = new Point(2, 3)
37-
point1.x // 2
38-
println(point1) // prints (2, 3)
65+
println(point1.x) // выводит 2
66+
println(point1) // выводит (2, 3)
67+
```
68+
69+
{% endtab %}
70+
71+
{% tab 'Scala 3' for=class-point-example %}
72+
73+
```scala
74+
class Point(var x: Int, var y: Int):
75+
76+
def move(dx: Int, dy: Int): Unit =
77+
x = x + dx
78+
y = y + dy
79+
80+
override def toString: String =
81+
s"($x, $y)"
82+
end Point
83+
84+
val point1 = Point(2, 3)
85+
println(point1.x) // выводит 2
86+
println(point1) // выводит (2, 3)
3987
```
4088

89+
{% endtab %}
90+
91+
{% endtabs %}
92+
4193
В этом классе у `Point` есть четыре члена: переменные `x` и `y` и методы `move` и `toString`.
4294
В отличие от многих других языков, основной конструктор находится в сигнатуре класса `(var x: Int, var y: Int)`. Метод `move` принимает два целочисленных аргумента и возвращает значение Unit `()` - это пустое множество, которое не содержит никакой информации. Примерно соответствует `void` в Java-подобных языках. С другой стороны, `toString` не принимает никаких аргументов, а возвращает значение `String`. Поскольку `toString` переопределяет `toString` из [`AnyRef`](unified-types.html), он помечается ключевым словом `override`.
4395

4496
## Конструкторы
4597

4698
Конструкторы могут иметь необязательные параметры, если указать их значения по умолчанию как в примере:
4799

100+
{% tabs class-point-with-default-values class=tabs-scala-version %}
101+
102+
{% tab 'Scala 2' for=class-point-with-default-values %}
103+
48104
```scala mdoc:nest
49105
class Point(var x: Int = 0, var y: Int = 0)
50106

51-
val origin = new Point // x и y оба равны 0
52-
val point1 = new Point(1)
53-
println(point1.x) // выводит 1
107+
val origin = new Point // x и y оба равны 0
108+
val point1 = new Point(1) // x равен 1, а y равен 0
109+
println(point1) // выводит (1, 0)
110+
```
111+
112+
{% endtab %}
113+
114+
{% tab 'Scala 3' for=class-point-with-default-values %}
115+
116+
```scala
117+
class Point(var x: Int = 0, var y: Int = 0)
54118

119+
val origin = Point() // x и y оба равны 0
120+
val point1 = Point(1) // x равен 1, а y равен 0
121+
println(point1) // выводит (1, 0)
55122
```
56123

124+
{% endtab %}
125+
126+
{% endtabs %}
127+
57128
В этой версии класса `Point`, `x` и `y` имеют значение по умолчанию `0`, поэтому аргументов не требуется. Однако, поскольку конструктор считывает аргументы слева направо, если вы просто хотите передать значение `y`, то вам нужно будет указать задаваемый параметр.
129+
130+
{% tabs class-point-named-argument class=tabs-scala-version %}
131+
132+
{% tab 'Scala 2' for=class-point-named-argument %}
133+
58134
```scala mdoc:nest
59135
class Point(var x: Int = 0, var y: Int = 0)
60-
val point2 = new Point(y=2)
61-
println(point2.y) // выводит 2
136+
val point2 = new Point(y = 2)
137+
println(point2) // выводит (0, 2)
62138
```
63139

140+
{% endtab %}
141+
142+
{% tab 'Scala 3' for=class-point-named-argument %}
143+
144+
```scala
145+
class Point(var x: Int = 0, var y: Int = 0)
146+
val point2 = Point(y = 2)
147+
println(point2) // выводит (0, 2)
148+
```
149+
150+
{% endtab %}
151+
152+
{% endtabs %}
153+
64154
Что также является хорошей практикой для повышения ясности кода.
65155

66156
## Скрытые члены и синтаксис Геттер/Сеттер (получатель/установщик значений)
157+
67158
По умолчанию члены класса являются открытыми для внешнего доступа (публичными). Используйте модификатор `private`, чтобы скрыть их от внешнего доступа.
68-
```scala mdoc:nest
159+
160+
{% tabs class-point-private-getter-setter class=tabs-scala-version %}
161+
162+
{% tab 'Scala 2' for=class-point-private-getter-setter %}
163+
164+
```scala mdoc:reset
69165
class Point {
70166
private var _x = 0
71167
private var _y = 0
72168
private val bound = 100
73169

74-
def x = _x
75-
def x_= (newValue: Int): Unit = {
76-
if (newValue < bound) _x = newValue else printWarning
170+
def x: Int = _x
171+
def x_=(newValue: Int): Unit = {
172+
if (newValue < bound)
173+
_x = newValue
174+
else
175+
printWarning()
77176
}
78177

79-
def y = _y
80-
def y_= (newValue: Int): Unit = {
81-
if (newValue < bound) _y = newValue else printWarning
178+
def y: Int = _y
179+
def y_=(newValue: Int): Unit = {
180+
if (newValue < bound)
181+
_y = newValue
182+
else
183+
printWarning()
82184
}
83185

84-
private def printWarning = println("WARNING: Out of bounds")
186+
private def printWarning(): Unit =
187+
println("WARNING: Out of bounds")
85188
}
86189

87190
val point1 = new Point
88191
point1.x = 99
89192
point1.y = 101 // выводит предупреждение (printWarning)
90193
```
91-
В данной версии класса `Point` данные хранятся в скрытых переменных `_x` и `_y`. Существуют методы `def x` и `def y` для доступа к скрытым данным. Методы `def x_=` и `def y_=` (сеттеры) предназначены для проверки и установки значения `_x` и `_y`. Обратите внимание на специальный синтаксис для сеттеров: метод `_=` применяется к имени геттера.
194+
195+
{% endtab %}
196+
197+
{% tab 'Scala 3' for=class-point-private-getter-setter %}
198+
199+
```scala
200+
class Point:
201+
private var _x = 0
202+
private var _y = 0
203+
private val bound = 100
204+
205+
def x: Int = _x
206+
def x_=(newValue: Int): Unit =
207+
if newValue < bound then
208+
_x = newValue
209+
else
210+
printWarning()
211+
212+
def y: Int = _y
213+
def y_=(newValue: Int): Unit =
214+
if newValue < bound then
215+
_y = newValue
216+
else
217+
printWarning()
218+
219+
private def printWarning(): Unit =
220+
println("WARNING: Out of bounds")
221+
end Point
222+
223+
val point1 = Point()
224+
point1.x = 99
225+
point1.y = 101 // выводит предупреждение (printWarning)
226+
```
227+
228+
{% endtab %}
229+
230+
{% endtabs %}
231+
232+
В данной версии класса `Point` данные хранятся в скрытых переменных `_x` и `_y`. Существуют методы `def x` и `def y` для доступа к скрытым данным. Методы `def x_=` и `def y_=` (сеттеры) предназначены для проверки и установки значения `_x` и `_y`. Обратите внимание на специальный синтаксис для сеттеров: метод `_=` применяется к имени геттера.
92233

93234
Первичные параметры конструктора с параметрами `val` и `var` являются общедоступными. Однако, поскольку `val` - это константа, то нельзя писать следующее.
235+
236+
{% tabs class-point-cannot-set-val class=tabs-scala-version %}
237+
238+
{% tab 'Scala 2' for=class-point-cannot-set-val %}
239+
94240
```scala mdoc:fail
95241
class Point(val x: Int, val y: Int)
96242
val point = new Point(1, 2)
97243
point.x = 3 // <-- не компилируется
98244
```
99245

246+
{% endtab %}
247+
248+
{% tab 'Scala 3' for=class-point-cannot-set-val %}
249+
250+
```scala
251+
class Point(val x: Int, val y: Int)
252+
val point = Point(1, 2)
253+
point.x = 3 // <-- не компилируется
254+
```
255+
256+
{% endtab %}
257+
258+
{% endtabs %}
259+
100260
Параметры без `val` или `var` являются скрытыми от внешнего доступа и видимы только внутри класса.
261+
262+
{% tabs class-point-non-val-ctor-param class=tabs-scala-version %}
263+
264+
{% tab 'Scala 2' for=class-point-non-val-ctor-param %}
265+
101266
```scala mdoc:fail
102267
class Point(x: Int, y: Int)
103268
val point = new Point(1, 2)
104269
point.x // <-- не компилируется
105270
```
271+
272+
{% endtab %}
273+
274+
{% tab 'Scala 3' for=class-point-non-val-ctor-param %}
275+
276+
```scala
277+
class Point(x: Int, y: Int)
278+
val point = Point(1, 2)
279+
point.x // <-- не компилируется
280+
```
281+
282+
{% endtab %}
283+
284+
{% endtabs %}
285+
286+
## Дополнительные ресурсы
287+
288+
- Узнайте больше о классах в [Scala Book](/ru/scala3/book/domain-modeling-tools.html#классы)
289+
- Как использовать [вспомогательные конструкторы классов](/ru/scala3/book/domain-modeling-tools.html#вспомогательные-конструкторы)

_tour/classes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,5 +262,5 @@ point.x // <-- does not compile
262262

263263
## More resources
264264

265-
* Learn more about Classes in the [Scala Book](/overviews/scala-book/classes.html)
266-
* How to use [Auxiliary Class Constructors](/overviews/scala-book/classes-aux-constructors.html)
265+
* Learn more about Classes in the [Scala Book](/scala3/book/domain-modeling-tools.html#classes)
266+
* How to use [Auxiliary Class Constructors](/scala3/book/domain-modeling-tools.html#auxiliary-constructors)

0 commit comments

Comments
 (0)