2014-12-30 14 views
23

Kotlin'i öğrenme sürecindeyim ve anlayamadığım bir problemle karşılaştım. Java sınıfı RuntimeException'ı Kotlin'de genişletmek ve üç farklı kurucunun herhangi birini, farklı durumlarda (istisna atmak istediğim zamanda sahip olduğum bilgilere dayanarak) kullanmak istiyorum. java olarak benim sınıf şu şekilde görünecektir:Kotlin'de, birden fazla kurucuya sahip bir sınıfı nasıl genişletirim?

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

Ben KOTLIN bunu yapmak çalıştığımda, bir kılavuz olarak bu cevabı kullandı: Kotlin secondary constructor ancak, uygun süper çağırmak anlamaya çalışırken bir sorun vardı kurucu doğru.

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

Ancak, yukarıda bu Kotlin örnekte, hep iki args ile süper yapıcı yürütmesini ve en uygun yapıcı yürütmesini değilim: Örneğin, kullanarak fonksiyonlar böyle iyi bir yaklaşım, gibi görünüyordu durum. Öyleyse işlerimin üstünde var, ama her durumda farklı bir kurucunun çağrıldığı Java'da ne yapacağını tam olarak yapmıyor. Ayrıca, yukarıdaki her eğlencenin içine yeni bir RuntimeException örneği oluşturmayı ve bunu PhotoLibException uygulamasına da göndermeyi denedim, ancak bunu yapmaya izin verilmedi.

Kotlin'de bunu doğru bir şekilde nasıl yapacağımı öneren var mı?

cevap

49

Güncelleme: Bu sorunu çözmek için M11 (0.11 *.) Kullanarak, secondary constructors kullanabilirsiniz beri: Şu

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

, aynı sınıftan farklı bir bağlamda farklı süper Kurucular çağırmak için hiçbir yolu yoktur . Ancak önümüzdeki aylarda desteklenecek.

İlgili konular