2012-05-03 19 views
11

Bài tập khá đơn giản từ Cay Horstmann's book «Scala for the impatient» khiến tôi khó hiểu. Đó là về primary, auxiliarydefault primary constructors:nhà thầu trong scala (tiểu học/phụ trợ/mặc định chính)

cũ 5.10: Hãy xem xét các lớp

class Employee(val name: String, var salary: Double) { 
    def this() { this("John Q. Public", 0.0) } 
} 

Rewrite nó để sử dụng các trường rõ ràng và một constructor chính mặc định.

Tôi không chắc chắn về việc mình phải làm. Có thể một số bạn đề xuất một giải pháp?

Tuy nhiên, cố gắng giải quyết bài tập này có thể đã làm cho tôi biết về một cái gì đó tôi đã không nhận thấy trước khi xây dựng về chính và val lĩnh vực (như bạn thấy, tôi không hoàn toàn chắc chắn):

Am I phải không nếu tôi nói rằng trường val (như name trong lớp Employee ở trên) chỉ có thể được khởi tạo thông qua hàm tạo primary chứ không phải bởi một số auxiliary? Trong trường hợp thứ hai, nó sẽ được xem xét bởi trình biên dịch như một sự phân công lại cho một trường val gây ra lỗi.

Lúc đầu, tôi nghĩ rằng val trường tương đương thô với các trường cuối cùng trong java mong rằng sẽ là hợp pháp khi chỉ định chúng lần đầu tiên trong bất kỳ nhà xây dựng nào nhưng có vẻ như tôi đã sai.

Tôi không hoàn toàn hài lòng với những gì chỉ có thể là một dự đoán hoang dã vì vậy tôi sẽ đánh giá cao nếu ai đó có thể cung cấp cho tôi thông tin chính xác hơn về điểm đó.

+0

Tôi đã có câu hỏi chính xác này từ cùng một bài tập. Có lẽ tôi đang bối rối bởi những gì tác giả có nghĩa là "rõ ràng". – vmayer

Trả lời

12

Từ "Lập trình trong Scala, 2nd edition" đoạn 6.7:

Trong Scala, mỗi nhà xây dựng phụ trợ phải gọi một constructor của lớp tương tự như hành động đầu tiên của nó. Hiệu ứng ròng của quy tắc này là mọi lời gọi hàm khởi tạo trong Scala sẽ kết thúc cuối cùng gọi hàm khởi tạo chính của lớp. Do đó, hàm tạo chính là điểm duy nhất của một lớp.

Vì vậy, tất cả dữ liệu để khởi tạo val phải nằm trong hàm khởi tạo chính.

lớp học của bạn với các lĩnh vực rõ ràng có thể một cái gì đó như:

class Employee(n: String = "John Q. Public", s: Double = 0.0) { 
    val name = n 
    var salary = s 
} 

hoặc không có giá trị tham số mặc định:

class Employee(n: String, s: Double) { 
    def this() = this("John Q. Public", 0.0) 
    val name = n 
    var salary = s 
} 
+0

Cảm ơn bạn đã trả lời. Tôi đã đến một giải pháp khá gần với bạn nhưng nghĩ rằng nó không phù hợp với mục tiêu của bài tập vì tôi đã thấy rằng "hàm tạo chính mặc định" là "không được khai báo một cách rõ ràng mà không có tham số." –

11

Trên thực tế, những gì tôi có trong tâm trí là một phiên bản với một chính không tham số người xây dựng, như sau:

class Employee { 
    private var _name = "John Q. Public" 
    var salary = 0.0 
    def this(n: String, s: Double) { this(); _name = n; salary = s; } 
    def name = _name  
} 

Rõ ràng, điều này kém hơn việc xác định các trường trong t ông là nhà xây dựng chính, đó là điểm mà tôi muốn thực hiện.

+1

Cảm ơn rất nhiều vì đã dành thời gian để làm rõ mục tiêu của bài tập. Ngoài ra một lời cảm ơn sâu sắc cho cuốn sách của bạn mà là khá bổ sung cho Martin Odersky và làm cho, nhiều hơn bất kỳ cuốn sách khác về chủ đề, bước đầu tiên trong Scala đơn giản hơn và thú vị hơn. –

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