2011-08-26 19 views
17

Şu anda Scala'yı öğreniyorum ve vaka derslerimi tasarlarken bazı problemlerim var. Aynı özelliklere sahip iki vaka sınıfına ihtiyacım var. Bu yüzden bu özellikleri tanımlayan soyut bir temel sınıftan miras almamın iyi bir fikir olacağını düşündüm. vaka sınıf kurucularınızdaki uri taban sınıfının uri özelliği üzerine yazılacağı için Ancak bu kodSoyut sınıftan miras kalan sınıflar

abstract class Resource(val uri : String) 

case class File(uri : String) extends Resource(uri) 
case class Folder(uri : String) extends Resource(uri) 

derleme değil.

Bunu tasarlamanın doğru yolu ne olurdu?

ben böyle bir şey yapmak mümkün istiyorum bu

val arr = Array[Resource](File("test"), Folder("test2")) 

arr.foreach { r : Resource => r match { 
    case f : File => println("It's a file") 
    case f : Folder => println("It's a folder") 
} } 

"eşdeğer" Java kodu

abstract class Resource { 
    private String uri; 

    public Resource(String uri) { 
     this.uri = uri 
    } 

    public String getUri() { 
     return uri; 
    } 
} 

// same for Folder 
class File extends Resource { 
    public File(String uri) { 
     super(uri); 
    } 
} 

cevap

25

doğru sözdizimi olmalıdır:

abstract class Resource { 
    val uri: String 
} 

case class File(uri : String) extends Resource 
case class Folder(uri : String) extends Resource 


Stream[Resource](File("test"), Folder("test2")) foreach { 
    r : Resource => r match { 
    case f : File => println("It's a file") 
    case f : Folder => println("It's a folder") 
} } 

DÜZENLEME

vaka sınıflar olmadan:

abstract class Resource(val uri : String) 

class File(uri : String) extends Resource(uri) { 
    override def toString = "..." 
} 
object File { 
    def apply(uri: String) = new File(uri) 
} 

class Folder(uri : String) extends Resource(uri) { 
    override def toString = "..." 
} 
object Folder { 
    def apply(uri: String) = new Folder(uri) 
} 
+1

Ancak, bu hem 'Dosya' hem de 'Klasör' içinde 'uri 'özelliği ve alıcıyı çoğaltır. Sorumda Java örneğine benzeyen temiz kod almanın bir yolu var mı? –

+0

Öyleyse neden vaka sınıfları kullanıyorsunuz? Vaka sınıfları, getter ve ayarlayıcıları ekler. Normal sınıfları ve onların eşlik eden nesnelerini yazın. – onof

+0

Bu çok fazla kazan plaka kodu mu olacağı? ;-) Bir örnek verebilir misiniz? –

5

gibi bir şey bu iki olgu sınıf tanımlamak ortak bir özelliği uzanır olun olmalıdır arayüz ve çalışması gerekir.

BTW, case ifadesindeki type cümleciğine önce bir tanımlayıcı gerekir.

trait Resource { 
    val uri: String 
} 

case class File(uri : String) extends Resource 
case class Folder(uri : String) extends Resource 

val arr = Array[Resource](File("test"), Folder("test2")) 

arr.foreach { r : Resource => r match { 
    case s: File => println("It's a file") 
    case s: Folder => println("It's a folder") 
}} 
+1

Ancak bu uri özelliği ve alıcı yöntemlerdir işleri depolanmış hem 'Dosya' hem de Klasör '(çoğalt). Yukarıdaki Java örneği gibi bazı temiz kodlar almayı umuyordum (sorumu güncelledim). –

İlgili konular