2011-11-18 27 views
38

Nếu tôi hiểu chính xác, các đặc điểm là điều gần nhất với các giao diện Java và các nhà xây dựng lớp sẽ tự động thiết lập các biến.Sử dụng hàm tạo scala để đặt biến được xác định trong đặc điểm

Nhưng nếu tôi có một lớp học kéo dài một đặc điểm và có một constructor mà lập một biến từ đặc điểm, vì vậy cái gì đó như:

trait Foo { 
    var foo: String 
} 

class Bar (foo: String) extends Foo { /* ... */ } 

Nơi tôi muốn foo chuỗi các đặc điểm được thiết lập khi Tôi tạo một đối tượng Bar.

Trình biên dịch dường như cho tôi lỗi về điều này. Cách chính xác để đạt được điều này là gì?

+1

Chỉ cần lưu ý: khởi tạo đặc điểm không phải là một điều đơn giản và với các biến và ghi đè, bạn có thể tuân thủ khởi tạo rất nhanh (tôi đã làm). Hãy chắc chắn rằng bạn thực sự cần nó. – CheatEx

Trả lời

25

Bar phải xác định tóm tắt var foo trong Foo (sẽ giống nhau đối với số val). Điều này có thể được thực hiện trong các nhà xây dựng

class Bar(var foo: String) extends Foo{...} 

(tất nhiên, nó có thể được thực hiện trong cơ thể của Bar quá). Theo mặc định, các tham số của hàm khởi tạo sẽ được chuyển thành private val nếu cần, đó là nếu chúng được sử dụng bên ngoài mã initiailization, trong các phương thức. Nhưng bạn có thể buộc hành vi bằng cách đánh dấu chúng val hoặc var, và có thể kiểm soát khả năng hiển thị như trong

class X(protected val s: String, private var i: Int) 

Ở đây bạn cần một công var để thực hiện Foo.

30
trait Foo { var foo: String = _ } 
class Bar(foo0: String) extends Foo { foo = foo0 } 

Đặc tính tuyên bố một biến chưa được khởi tạo; các lớp sau đó đặt nó bằng tham số đầu vào.

Ngoài ra,

trait Foo { 
    def foo: String 
    def foo_=(s: String): Unit 
} 
class Bar(var foo: String) extends Foo {} 

tuyên bố getter/setter cặp tương ứng với một foo, được thiết lập bởi các lớp.

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