2010-12-02 36 views
9

Sayım S # sınıfının Scaladoc'unda, şunu okuyabilirim: "Değer türünü uygulayan bir sınıf. Bu sınıf, numaralandırmanın adlandırma ve tamsayı tanımlama davranışını değiştirmek için geçersiz kılınabilir." Şaşkınım: Bir sınıfı nasıl geçersiz kılabilirim? override class Val extends super.Val gibi şeylere izin verilmez.Scala'da bir iç sınıf nasıl "geçersiz kılınır"?

+0

İç bir sınıfı tanımlamak mümkündür, örn. 'Nesne MyEnum' Enumeration 'nesnesini şöyle bir şekilde genişletir: 'class Val (i: Int, name: String) super.Val (i, name)' yi genişletir, ancak numaralandırılmadığı için Numaralandırma # Val'i neredeyse geçersiz kılar. herşey. –

cevap

12

Scala'da (henüz) sanal sınıf yok, bu nedenle override class Val ... yazamazsınız ve sonra new Val çağrısının yeni örnek için doğru sınıfı dinamik olarak seçeceğinden emin olun. Bunun yerine, sınıfın, başvurulan sınıfın örneğine (bu durumda, Enumeration) dayalı olarak seçileceği sınıftır.

Sanal sınıfları taklit etmenin genel yolu, class Val extends super.Val yazıp, sonra da sınıfın örnekleri için fabrika olarak çalışan korumalı bir yöntemi geçersiz kılmaktır. Bu durumda, ayrıca yöntemi geçersiz olurdu:

protected def Value(i: Int, name: String): Value = new Val(i, name) 

Enumeration sadece bu fabrikada yöntemi kullanarak Val örneklerini oluşturur. Genel olarak, bu kalıp programcının parçası üzerinde disiplin gerektirir, ancak kurucuları özel ilan ederek, programcıyı fabrika yöntemini kullanmaya zorlayarak sağlanabilir.

+0

Açıklama için teşekkürler. Şimdi, son bir yöntemi geçersiz kılmaya nasıl devam ettiğimi merak ediyorum ... –

+0

Hm ... haklısın .. bunu kontrol edeyim. – axel22

+0

(Diğer okuyucular için bir açıklama olarak: bahsettiğiniz yöntem aslında Enumeration.scala'da son şeklindedir.) Bu arada, "Scala'da henüz sanal sınıflar yok" yazdınız. Gelecekte ortaya çıkabilecek herhangi bir kanıt var mı? –

İlgili konular