Obiekty pakietu
Scala udostępnia obiekty pakietu jako wygodny kontener wspóldzielony w całym pakiecie.
Obiekty pakietu mogą zawierać dowolne definicje, nie tylko definicje zmiennych i metod. Na przykład, są często używane do przechowywania aliasów typów i niejawnych konwersji. Obiekty pakietu mogą nawet dziedziczyć klasy i cechy (traits) Scali.
Zgodnie z konwencją, kod źródłowy obiektu pakietu jest zwykle umieszczany w pliku źródłowym o nazwie package.scala
.
Każdy pakiet może mieć jeden obiekt pakietu. Wszelkie definicje umieszczone w obiekcie pakietu traktowane są jak członkowie samego pakietu.
Zobacz przykład poniżej. Załóżmy najpierw, że w pakiecie gradening.fruits
zdefiniowana jest klasa Fruit
i trzy obiekty tej klasy:
// in file gardening/fruits/Fruit.scala
package gardening.fruits
case class Fruit(name: String, color: String)
object Apple extends Fruit("Apple", "green")
object Plum extends Fruit("Plum", "blue")
object Banana extends Fruit("Banana", "yellow")
Teraz załóżmy, że chcesz umieścić zmienną planted
i metodę showFruit
bezpośrednio w pakiecie gardening.fruits
.
Możesz zrobić to w następujący sposób:
// in file gardening/fruits/package.scala
package gardening
package object fruits {
val planted = List(Apple, Plum, Banana)
def showFruit(fruit: Fruit): Unit = {
println(s"${fruit.name}s are ${fruit.color}")
}
}
Jako przykład tego, jak wygląda użycie definicji przygorowanych w ten sposób, obiekt PrintPlanted
importuje planted
i showFruit
w ten sam sposób, w jaki importuje klasę Fruit
- używając importu wieloznacznego w pakiecie gardening.fruits
.
// in file PrintPlanted.scala
import gardening.fruits._
object PrintPlanted {
def main(args: Array[String]): Unit = {
for (fruit <- planted) {
showFruit(fruit)
}
}
}
Obiekty pakietu są podobne do innych obiektów, co oznacza, że można je tworzyć przy użyciu dziedziczenia. Na przykład można łączyć kilka cech:
package object fruits extends FruitAliases with FruitHelpers {
// tutaj znajdują się pomocniki (helpers) i zmienne
}
Contributors to this page:
Contents
- Wprowadzenie
- Podstawy
- Hierarchia typów
- Klasy
- Domyślne wartości parametrów
- Parametry nazwane
- Cechy
- Krotki
- Kompozycja klas przez domieszki
- Funkcje wyższego rzędu
- Funkcje zagnieżdżone
- Rozwijanie funkcji (Currying)
- Klasy przypadków
- Dopasowanie wzorców (Pattern matching)
- Obiekty singleton
- Wzorce wyrażeń regularnych
- Obiekty ekstraktorów
- For Comprehensions
- Klasy generyczne
- Wariancje
- Górne ograniczenia typów
- Dolne ograniczenia typów
- Klasy wewnętrzne
- Typy abstrakcyjne
- Typy złożone
- Jawnie typowane samoreferencje
- Parametry domniemane
- Konwersje niejawne
- Metody polimorficzne
- Lokalna inferencja typów
- Operatory
- Parametry przekazywane według nazwy
- Adnotacje
- Pakiety i importy
- Obiekty pakietu