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/tutorials/tour/abstract-types.md
+5-5Lines changed: 5 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -12,9 +12,9 @@ tutorial-next: compound-types
12
12
tutorial-previous: inner-classes
13
13
---
14
14
15
-
W Scali, klasy są parametryzowane wartościami (parametry konstruktora) oraz typami (jeżeli klasa jest [generyczna](generic-classes.html)). Aby zachować regularność, zarówno typy jak i wartości są elementami klasy. Analogicznie, mogą być konkretne albo abstrakcyjne.
15
+
W Scali, klasy są parametryzowane wartościami (parametry konstruktora) oraz typami (jeżeli klasa jest [generyczna](generic-classes.html)). Aby zachować regularność, zarówno typy jak i wartości są elementami klasy. Analogicznie mogą one być konkretne albo abstrakcyjne.
16
16
17
-
Poniższy przykład definiuje wartość określaną przez abstrakcyjny typ, będący elementem [cechy](traits.html)`Buffer`:
17
+
Poniższy przykład definiuje wartość określaną przez abstrakcyjny typ będący elementem [cechy](traits.html)`Buffer`:
18
18
19
19
```tut
20
20
trait Buffer {
@@ -23,7 +23,7 @@ trait Buffer {
23
23
}
24
24
```
25
25
26
-
*Typy abstrakcyjne* są typami, które nie są jednoznacznie określone. W powyższym przykładzie wiemy tylko, że każdy obiekt klasy `Buffer` posiada typ `T`, ale definicja klasy `Buffer` nie zdradza jakiemu konkretnie typowi odpowiada `T`. Tak jak definicje wartość, możemy także nadpisać definicje typów w klasach pochodnych. Pozwala to nam na odkrywanie dodatkowych informacji o abstrakcyjnym typie poprzez zawężanie jego ograniczeń (które opisują możliwe warianty konkretnego typu).
26
+
*Typy abstrakcyjne* są typami, które nie są jednoznacznie określone. W powyższym przykładzie wiemy tylko, że każdy obiekt klasy `Buffer` posiada typ `T`, ale definicja klasy `Buffer` nie zdradza jakiemu konkretnie typowi on odpowiada. Tak jak definicje wartości, możemy także nadpisać definicje typów w klasach pochodnych. Pozwala to nam na odkrywanie dodatkowych informacji o abstrakcyjnym typie poprzez zawężanie jego ograniczeń (które opisują możliwe warianty konkretnego typu).
27
27
28
28
W poniższym programie definiujemy klasę `SeqBuffer`, która ogranicza możliwe typy `T` do pochodnych sekwencji `Seq[U]` dla nowego typu `U`:
29
29
@@ -35,7 +35,7 @@ abstract class SeqBuffer extends Buffer {
35
35
}
36
36
```
37
37
38
-
Cechy oraz [klasy](classes.html) z abstrakcyjnymi typami są często używane w połączeniu z anonimowymi klasami. Aby to zilustrować wykorzystamy program, w którym utworzymy bufor sekwencji, ograniczony do listy liczb całkowitych:
38
+
Cechy oraz [klasy](classes.html) z abstrakcyjnymi typami są często używane w połączeniu z anonimowymi klasami. Aby to zilustrować wykorzystamy program, w którym utworzymy bufor sekwencji ograniczony do listy liczb całkowitych:
Należy pamięctać o tym, żeby zastosować [adnotacji wariancji](variance.html). Inaczej nie byłoby możliwe ukrycie konkretnego typu sekwencji obiektu zwracanego przez metodę `newIntSeqBuf`.
79
+
Należy też pamiętać o tym, żeby zastosować [adnotacji wariancji](variance.html). Inaczej nie byłoby możliwe ukrycie konkretnego typu sekwencji obiektu zwracanego przez metodę `newIntSeqBuf`.
Copy file name to clipboardExpand all lines: pl/tutorials/tour/annotations.md
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -13,11 +13,11 @@ language: pl
13
13
14
14
Adnotacje dodają meta-informacje do różnego rodzaju definicji.
15
15
16
-
Podstawową formą adnotacji jest `@C` lub `@C(a1, ..., an)`. Tutaj `C` jest konstruktorem klasy `C`, który musi odpowiadać klasie `scala.Annotation`. Wszystkie argumenty konstruktora `a1, ..., an` muszą być stałymi wyrażeniami (czyli wyrażeniami takimi jak liczby, łańcuchy znaków, literały klasowe, enumeracji Javy oraz ich jednowymiarowe tablice).
16
+
Podstawową formą adnotacji jest `@C` lub `@C(a1, ..., an)`. Tutaj `C` jest konstruktorem klasy `C`, który musi odpowiadać klasie `scala.Annotation`. Wszystkie argumenty konstruktora `a1, ..., an` muszą być stałymi wyrażeniami (czyli wyrażeniami takimi jak liczby, łańcuchy znaków, literały klasowe, enumeracje Javy oraz ich jednowymiarowe tablice).
17
17
18
18
Adnotację stosuje się do pierwszej definicji lub deklaracji która po niej następuje. Możliwe jest zastosowanie więcej niż jednej adnotacji przed definicją lub deklaracją. Kolejność według której są one określone nie ma istotnego znaczenia.
19
19
20
-
Znaczenie adnotacji jest zależne od implementacji. Na platformie Java, poniższe adnotacje mają standardowe znaczenie:
20
+
Znaczenie adnotacji jest zależne od implementacji. Na platformie Java, poniższe adnotacje domyślnie oznaczają:
Copy file name to clipboardExpand all lines: pl/tutorials/tour/explicitly-typed-self-references.md
+24-8Lines changed: 24 additions & 8 deletions
Original file line number
Diff line number
Diff line change
@@ -67,14 +67,30 @@ Jeżeli przyjrzymy się bliżej implementacji metody `connectWith`, możemy dost
67
67
Scala rozwiązuje ten problem pozwalając na powiązanie klasy z innym typem poprzez jawne typowanie samoreferencji. Możemy użyć tego mechanizmu, aby naprawić powyższy kod:
68
68
69
69
```tut
70
-
class NodeImpl extends NodeIntf {
71
-
self: Node => // określenie typu "self"
72
-
def connectWith(node: Node): Edge = {
73
-
val edge = newEdge(this, node) // w tej chwili się skompiluje
74
-
edges = edge :: edges
75
-
edge
76
-
}
77
-
}
70
+
abstract class DirectedGraph extends Graph {
71
+
type Edge <: EdgeImpl
72
+
class EdgeImpl(origin: Node, dest: Node) {
73
+
def from = origin
74
+
def to = dest
75
+
}
76
+
class NodeImpl extends NodeIntf {
77
+
self: Node => // określenie typu "self"
78
+
def connectWith(node: Node): Edge = {
79
+
val edge = newEdge(this, node) // w tej chwili się skompiluje
80
+
edges = edge :: edges
81
+
edge
82
+
}
83
+
}
84
+
protected def newNode: Node
85
+
protected def newEdge(from: Node, to: Node): Edge
86
+
var nodes: List[Node] = Nil
87
+
var edges: List[Edge] = Nil
88
+
def addNode: Node = {
89
+
val node = newNode
90
+
nodes = node :: nodes
91
+
node
92
+
}
93
+
}
78
94
```
79
95
80
96
W nowej definicji klasy `NodeImpl` referencja `this` jest typu `Node`. Ponieważ typ `Node` jest abstrakcyjny i stąd nie wiemy jeszczy, czy `NodeImpl` w rzeczywistości odpowiada `Node`, system typów w Scali nie pozwoli nam na utworzenie tego typu. Mimo wszystko za pomocą jawnej adnotacji typu stwierdzamy, że w pewnym momencie klasa pochodna od `NodeImpl` musi odpowiadać typowi `Node` aby dało się ją utworzyć.
0 commit comments