2011-08-31 41 views
14

xem xét mã này:Trường hợp sử dụng của các nhà thầu phụ trong các lớp trừu tượng là gì?

abstract class Foo(val s: String) { 
    def this(i: Int) = this("" + (i+2)) 
} 

Theo như tôi hiểu nhà xây dựng không được thừa kế và nhà thầu thứ cấp không thể được gọi từ lớp con với super như trong Java.

Chúng chỉ là một tạo phẩm vô dụng hoặc có một số trường hợp sử dụng hợp lý cho cấu trúc này?

Trả lời

17
scala> object Bar extends Foo(3) 
defined module Bar 

scala> Bar.s 
res3: String = 5 
11

Phương thức khởi tạo chính của lớp con phải gọi một trong hàm tạo của lớp cha, không nhất thiết phải là hàm tạo chính.

abstract class A(s: String) { 
    def this(i: Int) = this(i.toString) 
} 
class B(i: Int) extends A(i) 
3

Ngoài câu trả lời @ coubeatczech, bạn cũng có thể tạo thể hiện của lớp trừu tượng (và đặc điểm) nếu bạn thêm một sự tinh tế,

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

abstract class Foo(val s: String) { 
    def this(i: Int) = this("" + (i+2)) 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 

scala> val f = new Foo(23) {} 
f: Foo = [email protected] 

scala> f.s 
res3: String = 25 

Mặc dù tôi đã thể hiện một tinh rỗng trên (" {} ") bạn thường sẽ cung cấp một số định nghĩa bổ sung, thường cung cấp triển khai cho các thành viên trừu tượng,

scala> abstract class Bar { def bar : Int } 
defined trait Bar 

scala> val b : Bar = new Bar { def bar = 23 } 
b: Bar = [email protected] 

scala> b.bar 
res1: Int = 23 
Các vấn đề liên quan