2010-10-10 16 views
13

Tôi đã xác định nhiều hàm tạo, với một số giá trị đối số mặc định trong tất cả chúng. Có vẻ chính xác (tôi không thể thấy bất kỳ sự mơ hồ nào), nhưng trình biên dịch Scala (2.8) than phiền:Tôi không thể xác định mặc định nếu tôi xác định nhiều nhà xây dựng quá tải trong Scala?

multiple overloaded alternatives of constructor define default arguments

Có nghĩa là tôi không thể xác định giá trị mặc định cho các nhà xây dựng quá tải không?

Hãy để tôi minh họa cho tình hình (primitivized, tất nhiên, nhưng minh họa):

 

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) { 

    def this (subject : Int, factor : Int = 1, doItRight : Boolean = true) = { 
    this(subject.toDouble , factor, doItRight) 
    } 

    def this (subject : String, factor : Int = 1, doItRight : Boolean = true) = { 
    this(subject.toDouble , factor, doItRight) 
    } 

    def this() = { 
    this(defaultSubject) 
    } 

} 


 
+1

Bạn có nhớ đăng mã bạn có với mã này không? –

Trả lời

9

Taken trực tiếp từ mã nguồn của trình biên dịch:

// only one overloaded alternative is allowed to define default arguments 

Nói chung, tôi sẽ không khuyên bạn trộn quá tải và mặc định. Ngay cả khi không có xung đột, nó có thể làm cho mã của bạn khó đọc hơn.

CẬP NHẬT

Vì bạn đã thêm mã, nên rõ ràng bạn không muốn/cần ghi đè giá trị mặc định cho mỗi hàm tạo thứ cấp. Trong trường hợp cụ thể của bạn, tôi thậm chí có thể đặt câu hỏi về sự cần thiết cho những người xây dựng thêm đó; Int => Double đã có sẵn cho bạn dưới dạng chuyển đổi ngầm và String => Double trông giống như bạn có thể đang làm hỏng hệ thống kiểu :)

Ngoài ra ... Là một thay thế cho các nhà xây dựng quá tải, bạn có thể xác định chỉ constructor với các giá trị mặc định, sau đó quá tải phương thức áp dụng của đối tượng đồng hành và sử dụng nó như một nhà máy. Đây là khóa học hoàn toàn tùy chọn, nhưng nó nhanh chóng trở thành thành lập như là một mô hình thông qua việc sử dụng các lớp trường hợp.

+0

Sử dụng các nhà máy có vẻ khá không cần thiết trong trường hợp, và vi phạm dao cạo của Occam. Nó thậm chí còn đẹp hơn để thực hiện các nhà xây dựng cho tất cả các trường hợp (bằng tay áp dụng các giá trị mặc định) IMHO, và vì vậy tôi đã thực hiện (trông quá cũ và tự lặp đi lặp lại mặc dù). – Ivan

+0

Tôi sẽ xem xét kỹ mã của tôi, nếu tôi cần số lượng nhà thầu này. Tôi hầu như không cần một người duy nhất trong những ngày này ... – soc

+0

Xin vui lòng không đưa upvote của tôi về câu trả lời này có nghĩa là tôi chấp thuận giới hạn ngôn ngữ này. – FLGMwt

4

Quá tải không thành công vì bạn (unnessesarily) xác định nhiều nhà thầu với giá trị mặc định. Thực hiện việc này thay thế:

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) { 

    def this (subject : Int) = { 
    this(subject.toDouble) 
    } 

    def this (subject : String) = { 
    this(subject.toDouble) 
    } 

    def this() = { 
    this(defaultSubject) 
    } 
} 
+0

Nhưng không phải là yếu tố và đối số doItRight cần phải được xác định rõ ràng nếu chủ đề Int hoặc String trong trường hợp này? – Ivan

+0

Chúng là mặc định? – soc

+0

@Ivan, Không, bạn không cần phải chỉ định chúng, vì bạn đã đặt giá trị mặc định cho chúng trong hàm dựng chính. –