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"?
cevap
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.
Açıklama için teşekkürler. Şimdi, son bir yöntemi geçersiz kılmaya nasıl devam ettiğimi merak ediyorum ... –
Hm ... haklısın .. bunu kontrol edeyim. – axel22
(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ı? –
İç 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. –