2012-01-01 35 views
8

özel tip özel üyesinin bir kamu alt üyesini açığa (Örnek basitleştirilmiştir fakat içerdiği tüm önemli parçalar): BuradaBulmaca - Ben böyle bir şey yapmak istiyorum

class Master 
{ 
    type DataType = Int 
    var counter : DataType = 0 
} 

class Slave(private val master : Master) 
{ 
    val counter = master.counter // (*) 
} 

Ve (*) Ben olsun hatası:

private value master escapes its defining scope as part of type Slave.this.master.DataType

val counter = master.counter

hatası anlıyorum ama nedenini anlamıyorum - tipi sınıfına Master değil, nesnenin master parçasıdır, bu nedenle sınıf özelse önemlidir, nesne değil. En azından teoride.

hızlı çözüm yapmak kolaydır:

val counter : Master#DataType = master.counter 

Ama bu daha önce olduğu gibi aynı kod açık bir versiyonudur, bu "sadece" daha yazarak alır inanıyoruz. Bu bir özellik mi o zaman?

Soru:

bir tür (burada VeriTürü) nesnenin bağımlı değil, sınıf (sınıfı örneği başına, yani tip tanımlı) Scala mi? Eğer

this is an explicit version of the exactly same code as before

Master#DataType ve master.DataType iki farklı türleridir dendiğinde

cevap

14

Yanılıyorsun.

master.DataType, dış nesne olarak master olan DataType örneğidir. Diğer bir deyişle, tam olarak ne soruyorsunuz, ama açıkça o zaman mastertürünün parçasıdır ve master değilse, türünü gösteremezsiniz.

Master#DataType, herhangi bir dış nesne için herhangi bir DataType örneğidir (Java'daki Master.DataType eşdeğeri). YORUM İÇİN

YANIT:

Tipi üyeleri ancak uyumlu bir türüne göre, (sadece bir nesne içeren anonim bir alt sınıf dahil) bir alt sınıfta geçersiz kılınabilir. Ve örnekte DataType zaten Master'da somuttur, bu yüzden onunla sadece uyumlu sınıfın kendisi kendisidir. Yani

val a = new Master { 
    override type DataType = String 
} 

gibi bir şey hangi mantıklı typecheck olmaz: Eğer var counter: String = 0 alırdım, saçma olduğu. Ancak çalışacaktır (ancak çok kullanışlı değildir). Bu nedenle, özet tür üye sayısını geçersiz kılmak yalnızca mantıklıdır. Ancak, iç sınıflar ile aynı şekilde yazılırlar, bu nedenle a.DataType genellikle b.DataType ile aynı kabul edilmez - aslında farklı olmasalar bile!

+0

Teşekkür ederim, eğer bu doğru bir şekilde anladım (ancak "Scala'da Programlama" bölümünden okumadım - inanıyorum - veya belki de kaymış), sınıfın her örneği için yalnızca sınıf başına değil . – greenoldman

+0

Güncelleme için teşekkür ederiz, bu çok değerli, maalesef mesajınızı 1'den fazla atlatamıyorum :-) – greenoldman

+0

Bu, Scala'daki diğer OOP dillerinden geldiğinde "gotcha" olabilecek yararlı şeylerden biridir. Çok özlü cevap; benim değerime değer;). – TechNeilogy

İlgili konular