2009-09-08 24 views
16

bir var olmayan bir soyut def geçersiz kılma:Scala bunu yapabilirim Scala yılında

trait SomeTrait { 
    protected def foo: String 
} 

class Wibble extends SomeTrait { 
    protected var foo = "Hello" 
} 

Ama foo

trait SomeTrait { 
    protected def foo: String = "World" 
} 

class Wibble extends SomeTrait { 
    protected var foo = "Hello" //complains about lack of override modifier 

    override protected var foo = "Hello" //complains "method foo_ overrides nothing" 
} 

Neden için varsayılan bir tanım sağlar aynı şeyi yapamaz bunu yapamam mı

DÜZENLEME: Scala-kullanıcılar bir konuşma posta listesine sonra Scala yılında raised this in trac

cevap

19

, bir var foo yazarken, Scala derleyici otomatik bir ayarlayıcı (foo_= adlandırılır) ve bir toplama (üretir var bunun için foo olarak adlandırılır ve alanı özel olarak ayarlar (javap ile 'public' Scala alanlarına sahip bir sınıfı derlerseniz özel olarak görürsünüz). 'Foo_ = hiçbir şeyi geçersiz kılar' hatası bu demektir. Özelliğinizde, bir foo_= yöntemini tanımlamamışsınızdır ve bir genel alan ayarlayıcısı ve için her zaman çiftleri gelir.

Özellik içinde varsayılan bir değer (yani soyut yöntem) belirtmezseniz, override anahtar sözcüğü gerekli değildir. Bu nedenle, ilk örneğinizde, alıcı soyut yöntemi ve ayarlayıcıyı geçersiz kılar ... sadece oradadır. Derleyici şikayetçi değil. Ancak, özelliğin yönteminin gerçek bir uygulamasını sağladığınızda, özellikle, override anahtar sözcüğünü geçersiz kılmanız gerekir. protected var foo yazarken, geter için override anahtar kelimesini belirtmediniz ve override protected var foo yazarken, derleyiciye foo_= yönteminin geçersiz kılınacağını da belirttiniz, ancak bu tür bir yöntemin özelliği yok. Ayrıca, mantıksal olarak bir def'u bir var ile geçersiz kılabilirsiniz (önceki paragrafta olduğu gibi geçersiz kılmanın sıkı bir görünümü göz önünde bulundurularak). Bir def mantıksal olarak bir işlevdir (bazı girdiler verirsiniz, bir çıktı üretir). Bir var no-arg işleviyle aynıdır, ancak değerini başka bir şeye ayarlamayı da destekler; bu, bir işlev tarafından desteklenmeyen bir işlemdir. Bunun yerine, onu val olarak değiştirirseniz Tamam olur. Her zaman aynı (önbelleğe alınmış) sonucu üreten bir işlev gibidir.

Eğer böyle bir şey yapabileceğini bir var benzer davranışa sahip olmak istiyorsanız

(açık belirleyici ve alıcılar sahip olarak): Artık

class Wibble extends SomeTrait { 
    private var bar = "Hello" 
    override protected def foo = bar 
    protected def foo_=(v: String) { bar = v} 
} 

Eğer bir var :) yapabileceğini her şeyi yapabilir.

val x = new Wibble 
println(x.foo) // yields "Hello" 
x.foo = "Hello again" 
println(x.foo) // yields "Hello again" 
+0

Üzgünüm - Bir hata yaptım - özgün özellik yöntemi de korunmuş olmalıdır. Mantıken bir "var" ile bir "def" 'i geçersiz kılmama konusunda sana katılıyorum emin değilim. Bütün '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '''''nın bir varyantı olduğunu bildiren bir fob '' diye adlandırılan bir erişimci olmasını beklediğimi, bu –

+0

’un bir uygulamasının size katılıyorum olduğunu düşünüyorum. Ben cevabı yazdığımda daha katı bir kavram olarak düşünmeyi düşünüyordum. Cevabı düzenleyeceğim ve işe yarar bir çözüm sağlayacağım :). –

+0

Bu tür bir '' geçersiz kılma var 'sözdizimi var –