2017-05-29 73 views
5

Niedawno rozpoczęte z KotlinKonstruktor w Kotlin

Według dokumentów Kotlin może istnieć jeden główny konstruktor i jeden lub więcej konstruktorów wtórnych.

Nie rozumiem, dlaczego ten błąd enter image description here

Ponieważ klasa test ma podstawową konstruktora.

Działa to dobrze:

open class test { 
} 

class test2 : test() { 
} 

A oto inna trudność mam do czynienia, kiedy zdefiniować drugorzędną konstruktora IDE pokazuje inny błąd mówiąc

supertypem inicjalizacji jest niemożliwa bez pierwotnego konstruktora enter image description here

Ale w poprzednim przykładzie roboczym zainicjował to, ale działało dobrze. Co zrobiłem źle?

+0

jest to ujęte w dokumentacji Kotlin dla konstruktorów? http://kotlinlang.org/docs/reference/classes.html#constructors –

Odpowiedz

5

Otrzymujesz ten błąd, ponieważ nawet jeśli nie zdefiniujesz podstawowego lub dodatkowego konstruktora w klasie bazowej, nadal będzie generowany domyślny konstruktor bezargumentowy dla tej klasy. Konstruktor klasy pochodnej powinien zawsze wywoływać niektóre super konstruktory, aw twoim przypadku jest tylko domyślny (jest to konstruktor, który można wywołać jak test(), aby utworzyć obiekt klasy). Kompilator i IDE zmuszają cię do tego.


Reguły super konstruktora w pewnym stopniu komplikują sprawę.

Jeśli zdefiniujesz konstruktor wtórny w klasie pochodnej bez definiowania podstawowego konstruktora (bez nawiasów w pobliżu deklaracji klasy), to sam konstruktor wtórny powinien wywołać super konstruktor i nie należy podawać żadnych argumentów super konstruktora w klasie oświadczenie:

class test2 : test { // no arguments for `test` here 
    constructor(a: Int) : super() { /* ... */ } 
}

Inną opcją jest określenie podstawowego konstruktora i wywołać ją z wtórnym jednym:

class test2() : test() { 
    constructor(a: Int) : this() { /* ... */ } 
} 
+0

Dzięki, @hotkey, usuwa drugi problem, z którym miałem do czynienia, nadal nie rozumiem, dlaczego pokazuje IDE ** Ten typ ma konstruktora **, gdy Odziedziczyłem 'test' w' test2', oczywiście 'test' nie ma konstruktora, prawda? –

+1

@ShafayatAlam, cóż, tak naprawdę: jeśli nie zdefiniujesz ani konstruktora podstawowego, ani dodatkowego w klasie, nadal będzie generowany domyślny konstruktor bezargumentowy, a ponieważ super konstruktor powinien zawsze być wywoływany w klasach pochodnych, siły IDE możesz zadzwonić do domyślnego. – hotkey

+0

@ShafayatAlam, zaktualizowano odpowiedź z wyjaśnieniem tego punktu. – hotkey