2011-08-26 83 views
17

Tôi hiện đang học Scala và tôi có một số vấn đề về thiết kế các lớp chữ hoa của mình. Tôi cần hai lớp vỏ có cùng thuộc tính. Vì vậy, tôi nghĩ rằng tôi sẽ là một ý tưởng tốt để kế thừa từ một lớp cơ sở trừu tượng định nghĩa các thuộc tính này. Tuy nhiên mã này không biên dịchCác lớp học kế thừa từ lớp trừu tượng

abstract class Resource(val uri : String) 

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

uri trong các nhà thầu trường hợp lớp sẽ ghi đè lên uri tài sản của lớp cơ sở.

Cách chính xác để thiết kế điều này là gì?

Tôi muốn để có thể làm điều gì đó như thế này

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") 
} } 

Mã "tương đương" Java nên có cái gì đó như

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); 
    } 
} 

Trả lời

25

Cú pháp đúng nên là:

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") 
} } 

EDIT

Nếu không có trường hợp các lớp:

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

Tuy nhiên điều này trùng lặp thuộc tính 'uri' và getter trong cả hai' File' và 'Folder'. Có cơ hội để có được mã sạch sẽ trông giống như ví dụ Java trong câu hỏi của tôi? –

+0

Sau đó, tại sao bạn sử dụng các lớp chữ thường? Trường hợp các lớp học thêm getter và setters. Viết các lớp bình thường và các đối tượng đồng hành của chúng. – onof

+0

Bởi vì điều này sẽ là quá nhiều mã tấm nồi hơi? ;-) Bạn có thể vui lòng cung cấp một ví dụ không? Đã cập nhật –

5

Thực hiện các trường hợp hai lớp kéo dài một đặc điểm chung mà định nghĩa nó giao diện và nó sẽ hoạt động.

BTW, bạn cần số nhận dạng trước mệnh đề loại trong câu hỏi case.

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

này tuy nhiên bất động sản và getter phương pháp uri là công trình được lưu trữ trong cả hai 'File' và' Folder' (trùng lặp). Tôi đã hy vọng sẽ có một số mã sạch như ví dụ Java ở trên (tôi đã cập nhật câu hỏi của mình). –

Các vấn đề liên quan