@@ -16,48 +16,111 @@ prerequisite-knowledge: no-return-keyword, type-declaration-syntax, string-inter
16
16
redirect_from : " /tutorials/tour/classes.html"
17
17
---
18
18
19
- Klase u Scali su šabloni koji mogu biti instancirani u više objekata tokom izvršavanja programa (runtime).
20
- Slijedi definicija klase ` Point ` :
21
-
22
- class Point(xc: Int, yc: Int) {
23
-
24
- var x: Int = xc
25
- var y: Int = yc
26
-
27
- def move(dx: Int, dy: Int) {
28
- x = x + dx
29
- y = y + dy
30
- }
31
-
32
- override def toString(): String = "(" + x + ", " + y + ")";
33
- }
34
-
35
- Ova klasa definiše dvije varijable: ` x ` i ` y ` , i dvije metode: ` move ` i ` toString ` .
36
- Metoda ` move ` prima dva cjelobrojna argumenta ali ne vraća vrijednost (implicitni povratni tip je ` Unit ` ,
37
- koji odgovoara ` void ` -u u jezicima sličnim Javi). ` toString ` , za razliku, ne prima nikakve parametre ali vraća ` String ` vrijednost.
38
- Pošto ` toString ` prebrisava predefinisanu ` toString ` metodu, mora biti tagovana s ` override ` .
39
-
40
- Klase u Scali se parametrizuju parametrima konstruktora. Kod iznad definiše dva parametra konstruktora, ` xc ` i ` yc ` ;
41
- oba su vidljiva u cijelom tijelu klase. U našem primjeru korišteni su za inicijalizaciju varijabli ` x ` i ` y ` .
42
-
43
- Klase se inicijalizaciju pomoću ` new ` primitive, kao u sljedećem primjeru:
44
-
45
- object Classes {
46
- def main(args: Array[String]) {
47
- val pt = new Point(1, 2)
48
- println(pt)
49
- pt.move(10, 10)
50
- println(pt)
51
- }
52
- }
53
-
54
- Program definiše izvršnu aplikaciju ` Classes ` u form vrhovnog singlton objekta s ` main ` metodom.
55
- Metoda ` main ` kreira novu instancu klase ` Point ` i sprema je u vrijednost ` pt ` .
56
- _ Imajte u vidu da se vrijednosti definisane primitivom ` val ` razlikuju
57
- od varijabli definisanih primitivom ` var ` (vidi klasu ` Point ` iznad)
58
- u tome da ne dozvoljavaju promjenu vrijednosti; tj. vrijednost je konstanta._
59
-
60
- Ovo je rezultat programa:
61
-
62
- (1, 2)
63
- (11, 12)
19
+ Klase u Scali su šabloni za kreiranje objekata.
20
+ Mogu sadržavati metode, vrijednosti, varijable, tipove, objekte, trejtove i klase koji se kolektivno zovu _ članovi_ .
21
+ Tipovi, objekti i trejtovi biće pokriveni kasnije.
22
+
23
+ ## Definisanje klase
24
+ Minimalna definicija klase sastoji se od riječi ` class ` i identifikatora. Imena klasa bi trebala počinjati velikim slovom.
25
+ ``` tut
26
+ class User
27
+
28
+ val user1 = new User
29
+ ```
30
+ Ključna riječ ` new ` koristi se za kreiranje instance klase.
31
+ ` User ` ima podrazumijevani konstruktor bez argumenata jer nijedan konstruktor nije definisan.
32
+ Međutim, često ćete imati konstruktor i tijelo klase.
33
+ Slijedi definicija klase ` Point ` (en. tačka):
34
+
35
+ ``` tut
36
+ class Point(var x: Int, var y: Int) {
37
+
38
+ def move(dx: Int, dy: Int): Unit = {
39
+ x = x + dx
40
+ y = y + dy
41
+ }
42
+
43
+ override def toString: String =
44
+ s"($x, $y)"
45
+ }
46
+
47
+ val point1 = new Point(2, 3)
48
+ point1.x // 2
49
+ println(point1) // prints (x, y)
50
+ ```
51
+
52
+ Ova klasa ima četiri člana: varijable ` x ` i ` y ` , i metode ` move ` i ` toString ` .
53
+ Za razliku od većine ostalih jezika, primarni konstruktor je sadržan u potpisu klase ` (var x: Int, var y: Int) ` .
54
+ Metoda ` move ` prima dva cjelobrojna argumenta i vraća ` Unit ` vrijednost, ` () ` .
55
+ Ovo otprilike odgovara ` void ` -u u jezicima sličnim Javi.
56
+ ` toString ` , za razliku, ne prima nikakve parametre ali vraća ` String ` vrijednost.
57
+ Pošto ` toString ` prebrisava metodu ` toString ` iz [ ` AnyRef ` ] ( unified-types.html ) , mora biti tagovana s ` override ` .
58
+
59
+ ## Konstruktori
60
+
61
+ Konstruktori mogu imati opcione parametre koristeći podrazumijevane vrijednosti:
62
+
63
+ ``` tut
64
+ class Point(var x: Int = 0, var y: Int = 0)
65
+
66
+ val origin = new Point // x and y are both set to 0
67
+ val point1 = new Point(1)
68
+ println(point1.x) // prints 1
69
+
70
+ ```
71
+
72
+ U ovoj verziji klase ` Point ` , ` x ` i ` y ` imaju podrazumijevanu vrijednost ` 0 ` tako da ne morate proslijediti argumente.
73
+ Međutim, pošto se argumenti konstruktora čitaju s lijeva na desno, ako želite proslijediti samo ` y ` vrijednost, morate imenovati parametar.
74
+ ```
75
+ class Point(var x: Int = 0, var y: Int = 0)
76
+ val point2 = new Point(y=2)
77
+ println(point2.y) // prints 2
78
+ ```
79
+
80
+ Ovo je također dobra praksa zbog poboljšanja čitljivosti.
81
+
82
+ ## Privatni članovi i sintaksa getera/setera
83
+ Članovi su javni (` public ` ) po defaultu.
84
+ Koristite ` private ` modifikator pristupa da sakrijete članove klase.
85
+ ``` tut
86
+ class Point {
87
+ private var _x = 0
88
+ private var _y = 0
89
+ private val bound = 100
90
+
91
+ def x = _x
92
+ def x_= (newValue: Int): Unit = {
93
+ if (newValue < bound) _x = newValue else printWarning
94
+ }
95
+
96
+ def y = _y
97
+ def y_= (newValue: Int): Unit = {
98
+ if (newValue < bound) _y = newValue else printWarning
99
+ }
100
+
101
+ private def printWarning = println("WARNING: Out of bounds")
102
+ }
103
+
104
+ val point1 = new Point
105
+ point1.x = 99
106
+ point1.y = 101 // prints the warning
107
+ ```
108
+ U ovoj verziji klase ` Point ` , podaci su spremljeni u privatnim varijablama ` _x ` i ` _y ` .
109
+ Metode ` def x ` i ` def y ` se koriste za njihov pristup.
110
+ ` def x_= ` i ` def y_= ` se koriste za validaciju i postavljanje vrijednosti ` _x ` i ` _y ` .
111
+ Primijetite specijalnu sintaksu za setere: metoda ima ` _= ` nadodano na identifikator getera a parametri dolaze poslije.
112
+
113
+ Parametri primarnog konstruktora s ` val ` i ` var ` su javni.
114
+ Međutim, pošto su ` val ` nepromjenjivi, ne možete napisati sljedeće.
115
+ ```
116
+ class Point(val x: Int, val y: Int)
117
+ val point = new Point(1, 2)
118
+ point.x = 3 // <-- does not compile
119
+ ```
120
+
121
+ Parametri bez ` val ` ili ` var ` su privatne vrijednosti, vidljive samo unutar klase.
122
+ ```
123
+ class Point(x: Int, y: Int)
124
+ val point = new Point(1, 2)
125
+ point.x // <-- does not compile
126
+ ```
0 commit comments