2010-10-28 13 views
6

Nesneye yönelik tasarım sınıfım için bir ev ödevi üzerinde çalışıyorum ve Scala'nın eşlik eden nesnelerinde sorun yaşıyorum. Eşlik eden nesnelerin, arkadaşlık sınıfının özel yöntemlerine erişim sahibi olması gereken birkaç yerde okudum, ancak çalışmayı başaramıyorum. (Sadece bir not olarak, atamanın eti bir ikili arama ağacını uygulamakla ilgiliydi, bu yüzden sadece cevaplar istemiyorum ...)Scala'daki sınıf arkadaşı nesnesinde neden özel sınıf yöntemlerine erişemiyorum?

Bir örnek oluşturması gereken bir nesnem var. benim özel sınıf, BstAtlas (Bst da Atlas nesnesinde tanımlanır, netlik için çıkardı):

object Atlas {            
    def focusRoom(newRoom:Room,a:Atlas):Atlas = a.helpFocusRoom(newRoom); 

    abstract class Atlas { 
    ... 
    protected def helpFocusRoom(n:Room):Atlas; 
    ... 
    } 

    private class BstAtlas(bst:Bst) extends Atlas { 
    ... 
    protected def helpFocusRoom(newRoom:Room):Atlas = ... 
     // uses some of bst's methods 
    ... 
    } 
} 

Ama derlemek gidince aşağıdaki hatayı alıyorum:

Question23.scala:15: error: method helpFocusRoom cannot be accessed in Atlas.Atlas a.helpFocusRoom(newRoom);

helpFocusRoom işlevinin gizlenmesi gerekiyor, ancak onu nasıl gizleyeceğimi bilmiyorum ve yine de ona erişebiliyorum tamamlayıcı nesnenin içinde.

Burada yanlış yaptığımı kimse söyleyebilir mi?

+0

wow .. Bir "ödev" etiketi olduğunu hiç bilmiyordum – pavanred

cevap

9

Sorun, sınıfların ve tamamlayıcı nesnelerin bu şekilde iç içe geçememeleridir. Bir tamamlayıcı nesne tanımlamak için, nesneyi nesnenin gövdesinin dışında ancak aynı dosyada tanımlamanız gerekir.

+1

Teşekkürler, bu öyle. Profesör, uygulama ayrıntılarını gizlemek için iç içe geçmiş yolu kullanmak için derste anlattı ... Ama bu şekilde aynı sonuca sahip gibi görünüyor (ve bir artı olan derlemeler). – Shaun

5

Tamamlayıcı nesneler olarak içermeyen, gerçek nesneye sonraki olmalıdır: Alternatif olarak

object Example { 
    class C(val i: Int = C.DefaultI) { } 
    object C { protected val DefaultI = 5 } 
} 

scala> (new Example.C).i 
res0: Int = 5 

scala> Example.C.DefaultI 
<console>:11: error: value DefaultI cannot be accessed in object Example.C 
    Example.C.DefaultI 

, onu kapsayan nesneyi içerecek şekilde protected anahtar kelimenin kapsamını değiştirebilir:

object Example { 
    def value = (new D).hidden 
    class D(val i: Int = 5) { 
    protected[Example] def hidden = i*i 
    } 
} 

scala> Example.value 
res1: Int = 25 

ancak Burada, dış nesneyi iç sınıfla aynı şey olarak adlandırmamalısınız ya da sınıfın içinden atıfta bulunmakta zorluk çekeceksiniz.

İlgili konular