2017-03-04 3 views
1

Ich habe eine abstrakte Klasse mit einem Feldinitialisieren abstrakte Klasse Feld Konstruktor in Kinder

public abstract class A { 
    var name: String = "Empty name" 
} 

und wollen es erben

public class B(name: String) : A() { 
    init { 
     this.name = name 
    } 
} 

Gibt es eine Möglichkeit für nicht ein Init-Block zu erstellen und tun One-Line-Initialisierung von name wie class B(::name: String)?

+0

keine Notwendigkeit Es gibt außer Kraft zu setzen, sondern einfach – Serge

Antwort

1

Nein, es gibt keine Möglichkeit, das für eine Eigenschaft zu tun, die nicht in der übergeordneten Klasse primary constructor deklariert ist.

Aber Sie können Ihr Beispiel das Hinzufügen eines primären Konstruktor verwandeln:

public abstract class A(var name: String = "Empty name") 

public class B(name: String) : A(name) 
+0

init Es sieht seltsam aus Zugriff haben für Felder im Konstruktor und keinen Zugang zu schaffen init bestehenden – Serge

0

Sie name machen können abstract oder open und dann override es in B. Beispiel:

public abstract class A { 
    open var name: String = "Empty name" 
} 
public class B(name: String) : A() { 
    override var name: String = name 
} 

Es ist nicht genau "in" der Konstruktor, aber es könnte Ihre Bedürfnisse erfüllen.

1

Sie override Anmerkung verwenden können

abstract class A { 
    open val name: String = "Empty name" 
} 

class B(override val name: String) : A() 
Verwandte Themen