nasıl

2014-04-19 6 views
14

bir kod var yapıcısı ile sınıfını genişleten özelliği örneğini? Anonim sınıfın vücudunda val veya def oluşturmaya çalıştı, yardımcı olmaz.nasıl

+0

no ile yeni E olarak tanımlamanın hiçbir yolu yoktur. Scala özelliği, bir sınıfı, yalnızca başka özellikleri uzatamaz. –

+2

aslında bir özellik bir sınıfı genişletebilir ancak yapıcısını çağırmaz (bu durumda sorun budur). Böyle bir özellik beyanının neden derlendiğini merak ediyorum bile. – sschaef

+0

@SteveWaldman @sschaef Özellikler, kurucu argümanlarıyla bile sınıfları genişletebilir. B sınıfı (isim: String), A (isim) ile E'yi uzatır, böyle bir özelliği kullanmanın tamamen iyi bir yoludur. – ghik

cevap

12

az olası çözümler:

1) ayarlanmış varsayılan değer adıSınıf bir yapıcı olarak:

class A(name : String = "name") 
trait E extends A 
new E {} // {} is obligatory. trait E is abstract and cannot be instantiated` 

2) karışımı sürekli A örneğine e:

object inst extends A("name") with E 
// or: 
new A("name") with E 
+0

Scala, triait sınıfını genişletmeyi yasaklamalıdır, çünkü bu, örneklenemediğinden kullanılamaz. –

2

A bir yapıcı argümanını alır;

new A("someName") with E 
+0

Bu yüzden “E” ile başlayan E'yi başlatamıyorum ...? – ka4eli

0

E sınıfı ile karıştırılacak özelliği E sınırlamak istiyorsanız, yalnızca kendi türünü kullanabilirsiniz. Bununla birlikte, bu değişkeni, A (...)

class A(val name: String) 

trait E { self: A => 
    def printName() = println(self.name) 
} 

val e = new A("This is A") with E 
e.printName()