2014-12-30 10 views
23

Ich bin in der Verarbeitung von Kotlin lernen, und stieß auf ein Problem, das ich nicht herausfinden konnte. Ich möchte die Java-Klasse RuntimeException in Kotlin erweitern, und in der Lage sein, einen von drei Konstruktoren zu verwenden, unter verschiedenen Umständen (basierend auf den Informationen, die ich zu der Zeit habe, die ich eine Ausnahme auslösen möchte). In Java wie folgt aus meiner Klasse aussehen:In Kotlin, wie erweitere ich eine Klasse, die mehrere Konstruktoren hat?

public class PhotoLibException extends RuntimeException { 

    public PhotoLibException(String message, RuntimeException ex) { 
     super(message, ex); 
    } 

    public PhotoLibException(String message) { 
     super(message); 
    } 

    public PhotoLibException(RuntimeException ex) { 
     super(ex); 
    } 
} 

Wenn ich versuche, dies in Kotlin zu tun, habe ich diese Antwort als Leitfaden: Kotlin secondary constructor jedoch hatte ich ein Problem, um herauszufinden, wie die entsprechende Super aufzurufen Konstruktor korrekt. Zum Beispiel schien mit Funktionen ein guter Ansatz zu sein, wie folgt aus:

fun PhotoLibException(message: String): PhotoLibException { 
    val ex = null 
    return PhotoLibException(message, ex) 
} 

fun PhotoLibException(ex: Exception): PhotoLibException { 
    val message = "" 
    return PhotoLibException(message, ex) 
} 

class PhotoLibException(message: String, ex: Exception?): RuntimeException(message, ex) { 
} 

jedoch in diesem Kotlin Beispiel oben, ich Aufruf immer die Super-Konstruktor mit zwei args, und nicht den Konstruktor am besten geeignet, um die Berufung Lage. Also, was ich oben habe funktioniert, aber nicht genau das, was es in Java tun würde, wo ein anderer Konstruktor in jeder Situation aufgerufen wird. Ich habe auch versucht, eine neue RuntimeException in jedem oben genannten Spaß zu instanziieren und sie auf PhotoLibException zu übertragen, aber das durfte ich nicht tun.

Kann jemand vorschlagen, wie ich das in Kotlin richtig machen würde?

Antwort

49

aktualisieren: Seit M11 (. 0,11 *), können Sie secondary constructors verwenden, dieses Problem zu lösen:

class PhotoLibException : RuntimeException { 
    constructor(message: String, ex: Exception?): super(message, ex) {} 
    constructor(message: String): super(message) {} 
    constructor(ex: Exception): super(ex) {} 
} 

Derzeit gibt es keine Möglichkeit verschiedenen Super-Konstrukteure aus der gleichen Klasse in anderem Zusammenhang zu nennen . Es wird jedoch in den kommenden Monaten unterstützt.

Verwandte Themen