2014-12-30 22 views
23

Jestem w trakcie uczenia się Kotlina, i wpadłem w problem, którego nie mogłem zrozumieć. Chciałbym przedłużyć klasę Java RuntimeException w Kotlin i móc używać dowolnego z trzech jego konstruktorów, w różnych okolicznościach (na podstawie informacji, które mam w momencie, gdy chcę rzucić wyjątek). W Javie moja klasa będzie wyglądać następująco:W Kotlin, jak mogę rozszerzyć klasę, która ma wiele konstruktorów?

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); 
    } 
} 

Kiedy próbuję to zrobić w Kotlin, użyłem tę odpowiedź jako przewodnika: Kotlin secondary constructor jednak miałem problem próbuje dowiedzieć się, jak wywołać odpowiednią Super konstruktor poprawnie. Na przykład za pomocą funkcji wydawał się być dobrym podejściem, tak:

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) { 
} 

Jednak w tym przykładzie Kotlin powyżej, jestem zawsze powołując super konstruktora z dwoma argumentami, a nie wywoływanie konstruktora najbardziej odpowiednie do sytuacja. Co mam powyżej działa, ale nie robi dokładnie to, co zrobiłby w Javie, gdzie inny konstruktor jest wywoływany w każdej sytuacji. Próbowałem też utworzyć nowy wyjątek RuntimeException w każdej zabawie powyżej i przesłać go do wyjątku PhotoLibException, ale nie mogłem tego zrobić.

Czy ktoś może zasugerować, jak zrobiłbym to poprawnie w Kotlin?

Odpowiedz

49

Aktualizacja: Ponieważ M11 (. 0,11 *), można użyć secondary constructors aby rozwiązać ten problem:

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

Obecnie nie ma sposobu, aby wywołać różne super-konstruktorów w innym kontekście z tej samej klasy . Będzie jednak wspierany w nadchodzących miesiącach.

Powiązane problemy