Skip to content

Commit 4e2bcb1

Browse files
committed
Classes section done
1 parent 23cac09 commit 4e2bcb1

File tree

1 file changed

+108
-45
lines changed

1 file changed

+108
-45
lines changed

_ba/tour/classes.md

Lines changed: 108 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,48 +16,111 @@ prerequisite-knowledge: no-return-keyword, type-declaration-syntax, string-inter
1616
redirect_from: "/tutorials/tour/classes.html"
1717
---
1818

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

Comments
 (0)