2010-10-10 21 views
13

Tümünde bazı varsayılan argüman değerleriyle birden fazla kurucu tanımladım. Görünüşe (Ben belirsizliği göremiyorum) doğru, ama Scala (2.8) derleyici yakınır: Scala'da çok sayıda aşırı yükleniciyi tanımladığımda varsayılanları tanımlayamıyorum?

multiple overloaded alternatives of constructor define default arguments

ben hiç aşırı yüklü kurucular için varsayılan değerleri tanımlamak olamaz anlamına mı geliyor?

Bana durumu açıklayalım (tabii primitivized, fakat açıklayıcı): derleyici'nın kaynak kodundan düz Alınan

 

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) { 

    def this (subject : Int, factor : Int = 1, doItRight : Boolean = true) = { 
    this(subject.toDouble , factor, doItRight) 
    } 

    def this (subject : String, factor : Int = 1, doItRight : Boolean = true) = { 
    this(subject.toDouble , factor, doItRight) 
    } 

    def this() = { 
    this(defaultSubject) 
    } 

} 


 
+1

Bununla birlikte, bu kodun kodunu yazabilir misiniz? –

cevap

9

: Genel olarak

// only one overloaded alternative is allowed to define default arguments 

, bunu tavsiye etmem aşırı yükleme ve varsayılan değerleri karıştırırsınız. Çakışma olmasa bile kodunuzun okunmasını zorlaştırabilir.

GÜNCELLEME

kod eklendi yana, sen/istemiyorum şimdi açık olduğu her ikincil yapıcı için varsayılan değerleri geçersiz kılmak gerekir. Sizin özel durumunuzda, bu ekstra kuruculara olan ihtiyacı bile sorgulayabilirim; Int => Double, örtük bir dönüşüm olarak sizin için zaten kullanılabilir ve String => Çiftli, sistem türünü saptırıyor olabilir :)

Ayrıca ... Aşırı yüklenicilere alternatif olarak, yalnızca birincil varsayılan olarak kurucu, daha sonra eşlik eden nesnenin uygulama yöntemini aşırı yükler ve bunu bir fabrika olarak kullanır. Bu elbette tamamen isteğe bağlıdır, ancak vaka sınıflarının kullanımı yoluyla bir kalıp olarak hızla kurulmaktadır.

+0

Fabrikaları kullanmak durumları gereksiz ve Occam'ın usturalarını ihlal ediyor. Tüm durumlarda (varsayılan değerleri manuel olarak uygulayarak) IMHO için kurucuları uygulamak daha da güzel olurdu ve ben de yaptım (çok eski ve kendini tekrar eden gibi görünüyor). – Ivan

+0

Bu miktarda kurucuya ihtiyacım olursa, koduma çok sıkı bakarım. Bu günlerde neredeyse hiç birine ihtiyacım yok ... – soc

+0

Lütfen bu yanıtı onaylamadığımı belirtmek için bu dil sınırlamasını onaylamıyorum. – FLGMwt

4

Aşırı yükleme başarısız oluyor çünkü siz (beklenmedik şekilde) varsayılan değerlere sahip birden fazla kurucu tanımlayabilirsiniz. Bunun yerine aşağıdakileri yapın:

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) { 

    def this (subject : Int) = { 
    this(subject.toDouble) 
    } 

    def this (subject : String) = { 
    this(subject.toDouble) 
    } 

    def this() = { 
    this(defaultSubject) 
    } 
} 
+0

Ama bu durumda konu Int veya String ise faktör ve doItRight argümanlarının açıkça belirtilmesi gerekmiyor mu? – Ivan

+0

Varsayılan değerlerdir? – soc

+0

@Ivan, Hayır, bunları ana kurucuda onlar için varsayılan değerleri önceden belirlediğiniz için belirtmeniz gerekmez. –