2015-05-19 18 views
8

Tôi có một lớp trừu tượng với giá trị mặc định cho tham số của nó. Tôi không muốn phải sử dụng lại giá trị mặc định trong hàm tạo của tất cả các triển khai có thể có.Tham số mặc định kế thừa Scala trong lớp cha

abstract class Place(val place: String = "World") 
class Message(val message: String = "Hello", p: String) extends Place(p) { 
    override def toString = s"$message $place" 
} 

Những gì tôi muốn để có được

new Message("Hi", "Universe") = "Hi Universe" // Ok 
new Message("Hi") = "Hi World" // Doesn't work, second parameter is required 
new Message() = "Hello World" // Doesn't work, second parameter is required 

tôi coi việc sử dụng một constructor phụ bỏ qua tham số thứ hai, nhưng nó không giúp vì bạn không thể gọi siêu constructors bên ngoài của các nhà xây dựng chính.

Tôi muốn biết cách thực hiện hoặc tại sao không thể thực hiện được. Tôi không tìm cách giải quyết, như không sử dụng thừa kế.

Trả lời

1

Bạn có thể tái sử dụng các giá trị mặc định trong một cách thanh lịch hơn:

object Place { 
    val defaultPlace = "World" 
} 
abstract class Place(val place: String = Place.defaultPlace) 
class Message(val message: String = "Hello", p: String = Place.defaultPlace) extends Place(p) { 
    override def toString = s"$message $place" 
} 
+0

công trình. không được đóng gói. Ở đây bạn có 3 đối tượng để sắp xếp (đối tượng, trừu tượng và lớp). Đặc biệt không cho tín dụng cho đối tượng và trừu tượng có cùng tên. Lớp tin nhắn phải biết về đối tượng Địa điểm để sử dụng điều này đòi hỏi nhiều hệ thống dây điện hơn, nếu điều đó có ý nghĩa gì. trừu tượng và bê tông nên xử lý tất cả. – Drew

3

Tôi e rằng điều đó là không thể. Rất đơn giản, bạn đang chuyển một giá trị tới hàm dựng, vì vậy nó sẽ không sử dụng giá trị mặc định, bất kể giá trị của nó có thể là gì. Nếu bạn không nhớ có var thay vì val, dưới đây là một biến thể hoạt động cho 3 trường hợp của bạn:

abstract class Place(var place: String = "World") 
class Message(val message: String = "Hello") extends Place() 
{ 
    def this(message: String, place: String) = { 
     this(message) 
     this.place = place 
    } 
    override def toString = s"$message $place" 
} 

Constructors in Scala là một phần nhỏ của IMHO. Đôi khi, câu trả lời tốt hơn là chỉ sử dụng các phương pháp nhà máy apply() trên một đối tượng đồng hành, linh hoạt hơn.

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