2010-03-08 30 views

Trả lời

151

nhà xây dựng quá tải không phải là đặc biệt đối với trường hợp các lớp:

case class Foo(bar: Int, baz: Int) { 
    def this(bar: Int) = this(bar, 0) 
} 

new Foo(1, 2) 
new Foo(1) 

Tuy nhiên, bạn có thể muốn cũng quá tải phương pháp apply trong đối tượng đồng hành, được gọi là khi bạn bỏ qua new.

object Foo { 
    def apply(bar: Int) = new Foo(bar) 
} 

Foo(1, 2) 
Foo(1) 

Trong Scala 2.8, thông số đặt tên và mặc định thường có thể được sử dụng thay vì quá tải.

case class Baz(bar: Int, baz: Int = 0) 
new Baz(1) 
Baz(1) 
+0

Rất tốt :) Tôi đang tìm kiếm một cái gì đó như giá trị dự phòng trong scala, có phải mới từ 2.8? Tôi không biết :) – Felix

+0

Có, Các thông số được đặt tên và Mặc định là mới trong Scala 2.8. – retronym

+7

Martin Odersky giải thích lý do tại sao các phương pháp áp dụng bổ sung không được thêm tự động: http://www.scala-lang.org/node/976 –

17

Bạn có thể xác định hàm tạo quá tải theo cách thông thường, nhưng để gọi nó, bạn phải sử dụng từ khóa "mới".

scala> case class A(i: Int) { def this(s: String) = this(s.toInt) } 
defined class A 

scala> A(1) 
res0: A = A(1) 

scala> A("2") 
<console>:8: error: type mismatch; 
found : java.lang.String("2") 
required: Int 
     A("2") 
     ^

scala> new A("2") 
res2: A = A(2) 
+2

Điều đó không đúng - bạn có thể khai báo nó trong đối tượng đồng hành như bình thường –

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