Jak zapewnić przeciążone konstruktory w Scali?
135
Warto wyraźnie wspomnieć, że konstruktory pomocnicze w Scali muszą albo wywołać odpowiedź głównego konstruktora (jak w landon9720), albo innego pomocniczego konstruktora z tej samej klasy, jako swoją pierwszą akcję. Nie mogą po prostu wywołać konstruktora nadklasy jawnie lub niejawnie, tak jak w Javie. Zapewnia to, że główny konstruktor jest jedynym punktem wejścia do klasy.
class Foo(x: Int, y: Int, z: String) {
// default y parameter to 0
def this(x: Int, z: String) = this(x, 0, z)
// default x & y parameters to 0
// calls previous auxiliary constructor which calls the primary constructor
def this(z: String) = this(0, z);
}
new Foo(x=2,z=4)
inew Foo(z=5)
jeśli zmienisz pierwszą linię naclass Foo(x: Int = 0, y: Int = 0, z: String) {
new
słowo kluczowe jest konieczne nawet w przypadku klas przypadków.źródło
Począwszy od Scala 2.8.0 możesz również mieć domyślne wartości parametrów contructor- i method. Lubię to
Parametry z wartościami domyślnymi muszą występować po parametrach bez wartości domyślnych na liście parametrów.
źródło
class Foo(val x:Int, y:Int=2*x)
nie działa.new Foo(x=2,z=4)
wydrukujeFoo(2,0,4)
.Patrząc na mój kod, nagle zdałem sobie sprawę, że trochę przeładowałem konstruktora. Potem przypomniałem sobie to pytanie i wróciłem, aby udzielić innej odpowiedzi:
W Scali nie możesz przeciążać konstruktorów, ale możesz to zrobić za pomocą funkcji.
Wiele osób decyduje się również na uczynienie
apply
funkcji obiektu towarzyszącego fabryką dla odpowiedniej klasy.Uczyniając tę klasę abstrakcyjną i przeciążając
apply
funkcję w celu zaimplementowania tej klasy, otrzymujesz przeciążony „konstruktor”:Zauważ, że jawnie definiuję każdy
apply
z nich do zwrotuExpectation[T]
, w przeciwnym razie zwróciłoby to kaczkę wpisanąExpectation[T]{val expected: List[T]}
.źródło
Spróbuj tego
źródło