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: _pl/tour/classes.md
+95-17
Original file line number
Diff line number
Diff line change
@@ -6,49 +6,127 @@ discourse: false
6
6
7
7
partof: scala-tour
8
8
9
-
num: 3
9
+
num: 4
10
10
language: pl
11
11
next-page: traits
12
12
previous-page: unified-types
13
13
---
14
14
15
-
Klasy w Scali określają schemat obiektów podczas wykonania programu. Oto przykład definicji klasy `Point`:
15
+
Klasy w Scali są wzorcami do tworzenia obiektów.
16
+
Klasy mogą zawierać metody, wartości, zmienne, typy, obiekty, cechy i klasy; wszystkie one są nazywane składnikami klasy (_class members_).
17
+
Typy, obiekty i cechy zostaną omówione w dalszej części przewodnika.
18
+
19
+
## Definiowanie klasy
20
+
21
+
Minimalna definicja klasy składa się ze słowa kluczowego `class` oraz jej identyfikatora.
22
+
Nazwy klas powinny zaczynać się z wielkiej litery.
23
+
24
+
```tut
25
+
class User
26
+
27
+
val user1 = new User
28
+
```
29
+
30
+
Do tworzenia nowych instancji klasy służy słowo kluczowe `new`.
31
+
Ponieważ żaden konstruktor nie został zdefiniowany, klasa `User` posiada konstruktor domyślny, który nie przyjmuje żadnych parametrów.
32
+
Zazwyczaj jednak definiujemy konstruktor i ciało klasy.
33
+
Poniższy przykład przedstawia definicję klasy służącej do reprezentowania punktu.
16
34
17
35
```tut
18
36
class Point(var x: Int, var y: Int) {
37
+
19
38
def move(dx: Int, dy: Int): Unit = {
20
39
x = x + dx
21
40
y = y + dy
22
41
}
42
+
23
43
override def toString: String =
24
-
"(" + x + ", " + y + ")"
44
+
s"($x, $y)"
25
45
}
46
+
47
+
val point1 = new Point(2, 3)
48
+
point1.x // 2
49
+
println(point1) // wyświetla (2, 3)
50
+
```
51
+
52
+
Klasa `Point` ma cztery składniki: zmienne `x` i `y` oraz metody `move` i `toString`.
53
+
W przeciwieństwie do innych języków programowania, główny konstruktor zawiera się w sygnaturze klasy: `(var x: Int, var y: Int)`.
54
+
Metoda `move` przyjmuje jako parametry dwie liczby całkowite i zwraca wartość `()` typu `Unit`, która nie niesie ze sobą żadnych informacji.
55
+
Odpowiada to słowu kluczowemu `void` w językach Java - podobnych.
56
+
Metoda `toString` nie przyjmuje żadnych parametrów, ale zwraca wartość typu `String`.
57
+
Ponieważ `toString` nadpisuje metodę `toString` zdefiniowaną w [`AnyRef`](unified-types.html), jest ona dodatkowo oznaczona słowem kluczowym `override`.
58
+
59
+
## Konstruktory
60
+
61
+
Konstruktory mogą zawierać parametry opcjonalne - wystarczy dostarczyć wartość domyślną dla takiego parametru.
62
+
63
+
```tut
64
+
class Point(var x: Int = 0, var y: Int = 0)
65
+
66
+
val origin = new Point // x i y są mają wartość 0
67
+
val point1 = new Point(1)
68
+
println(point1.x) // wyświetla 1
69
+
26
70
```
27
71
28
-
Klasy w Scali są sparametryzowane poprzez argumenty konstruktora. Powyższy kod wymaga podania dwóch argumentów konstruktora: `x` i `y`. Oba parametry są widoczne w zasięgu ciała klasy.
72
+
W tej wersji klasy `Point`, `x` oraz `y` mają domyślną wartość `0` - dlatego nie jest wymagane przekazanie żadnych parametrów.
73
+
Jednak z powodu tego, że konstruktor jest ewaluowany od lewej do prawej strony, jeżeli chcesz przekazać parametr tylko do argumentu `y`, musisz określić nazwę tego parametru.
74
+
75
+
```
76
+
class Point(var x: Int = 0, var y: Int = 0)
77
+
val point2 = new Point(y = 2)
78
+
println(point2.y) // wyświetla 2
79
+
```
29
80
30
-
Klasa `Point` zawiera także dwie metody: `move` i `toString`. `move` pobiera dwa argumenty w postaci liczb całkowitych, ale nie zwraca żadnej wartości (zwracany typ `Unit` odpowiada `void` w językach takich jak Java). Z drugiej strony `toString` nie wymaga żadnych parametrów, ale zwraca łańcuch znaków typu `String`. Ponieważ `toString` przesłania predefiniowaną metodę `toString`, jest ona oznaczona słowem kluczowym `override`.
81
+
Jest to również dobra praktyka, która zwiększa przejrzystość kodu.
31
82
32
-
Należy dodać, że w Scali nie jest wymagane podanie słowa kluczowego `return` w celu zwrócenia wartości. Dzięki temu, że każdy blok kodu w Scali jest wyrażeniem, wartością zwracaną przez metodę jest ostatnie wyrażenie w ciele metody. Dodatkowo proste wyrażenia, takie jak zaprezentowane na przykładzie implementacji `toString` nie wymagają podania klamer, zatem można je umieścić bezpośrednio po definicji metody.
83
+
## Prywatne składniki oraz składnia getterów i setterów
33
84
34
-
Instancje klasy można tworzyć w następujący sposób:
85
+
Domyślnie wszystkie składniki klasy są publiczne.
86
+
Aby ukryć je przed zewnętrznymi klientami (wszystkim co jest poza daną klasą), należy użyć słowa kluczowego `private`.
35
87
36
88
```tut
37
-
object Classes {
38
-
def main(args: Array[String]) {
39
-
val pt = new Point(1, 2)
40
-
println(pt)
41
-
pt.move(10, 10)
42
-
println(pt)
89
+
class Point {
90
+
private var _x = 0
91
+
private var _y = 0
92
+
private val bound = 100
93
+
94
+
def x = _x
95
+
def x_= (newValue: Int): Unit = {
96
+
if (newValue < bound) _x = newValue else printWarning
43
97
}
98
+
99
+
def y = _y
100
+
def y_= (newValue: Int): Unit = {
101
+
if (newValue < bound) _y = newValue else printWarning
102
+
}
103
+
104
+
private def printWarning = println("UWAGA: wartość poza przedziałem")
44
105
}
106
+
107
+
val point1 = new Point
108
+
point1.x = 99
109
+
point1.y = 101 // wyświetla ostrzeżenie
45
110
```
46
111
47
-
Program definiuje wykonywalną aplikację w postaci [obiektu singleton](singleton-objects.html) z główną metodą `main`. Metoda `main` tworzy nową instancję typu `Point` i zapisuje ją do wartości `pt`. Istotną rzeczą jest to, że wartości zdefiniowane z użyciem słowa kluczowego `val` różnią się od zmiennych określonych przez `var` (jak w klasie `Point` powyżej) tym, że nie dopuszczają aktualizacji ich wartości.
112
+
W powyższym przykładnie klasy `Point` dane przechowywane są w prywatnych zmiennych `_x` i `_y`.
113
+
Publiczne metody `def x` i `def y` istnieją w celu uzyskania dostępu do prywatnych danych - są to gettery.
114
+
Metody `def x_=` i `def y_=` (settery) służą do walidacji oraz ustawiania wartości zmiennych `_x` i `_y`.
115
+
Zwróć uwagę na specyficzną składnię dla setterów: posiadają one `_=` dołączone do nazwy, dopiero w dalszej kolejności zdefiniowane są ich parametry.
116
+
117
+
Parametry głównego konstruktora oznaczone przez `val` i `var` są publiczne.
118
+
Ponieważ `val` jest niezmienne, poniższy kod nie jest prawidłowy
119
+
120
+
```
121
+
class Point(val x: Int, val y: Int)
122
+
val point = new Point(1, 2)
123
+
point.x = 3 // <-- nie kompiluje się
124
+
```
48
125
49
-
Wynik działania programu:
126
+
Parametry konstruktora __nie__ zawierające `val` lub `var` są prywatne - widoczne jedynie we wnętrzu klasy.
0 commit comments