2011-10-12 32 views
7

Câu hỏi Naive Tôi tin, nhưng tất cả những gì tôi thấy chỉ là gọi các nhà thầu khác từ các nhà thầu. Tôi cần gọi một phương pháp. Lớp học của tôi (bắt đầu):Cách thêm một số hành động trong hàm tạo?

class ScopedIterator[T](val iter : Iterator[T]) 
{ 
    private var had_next : Boolean; 
    private var value : T; 

    moveNext(); 

    ... 

vì vậy tôi muốn có một người xây dựng với một đối số duy nhất, và trong nhà xây dựng như vậy gọi phương thức moveNext. Đó là tất cả.

Khi tôi biên dịch mã tôi nhận được lỗi:

error: abstract member may not have private modifier

private var had_next : Boolean;

và tương tự cho giá trị.

tôi đã thay đổi nó để:

class ScopedIterator[T] 
{ 
    private var had_next : Boolean; 
    private var value : T; 
    private var iter : Iterator[T]; 

    def this(it : Iterator[T]) = 
    { 
    iter = it; 
    moveNext(); 
    } 

    ... 

Nhưng bây giờ tôi nhận được lỗi trên "iter = nó":

error: 'this' expected but identifier found.

iter = it;

Làm thế nào để viết constructor như vậy trong Scala?

+0

Cụ thể bạn nhận được lỗi nào trên 'iter = it'? – asm

+0

@Andrew Myers, xin lỗi, đã cập nhật. – greenoldman

Trả lời

18

Vấn đề đầu tiên là định nghĩa của bạn về had_nextvalue là trừu tượng: các thành viên này không có bên tay phải.

Hãy thử thay vì:

class ScopedIterator[T](val iter : Iterator[T]) { 
    private var had_next : Boolean = _ 
    private var value : T = _ 
    ... 
} 

Ở đây, _ có nghĩa là "mặc định giá trị chưa được khởi tạo". Ví dụ, các công trình sau đây cho tôi trong giao diện điều khiển:

class ScopedIterator[T](val iter : Iterator[T]) { 
    private var had_next : Boolean = _ 
    private var value : T = _ 

    init() 

    def init() : Unit = { println("init !") } 
} 

scala> new ScopedIterator(List(1,2,3).toIterator) 
init ! 
resN: ScopedIterator[Int] = ... 

Vấn đề thứ hai (" 'này' mong đợi ...") đi kèm bởi vì trong Scala, nhà thầu phụ phải luôn luôn gọi một constructor như đầu tiên của họ tuyên bố. Vì vậy, nhà xây dựng của bạn có thể bắt đầu với this(), ví dụ. Để biết thêm chi tiết, xem Phần 6.7 trong Programming in Scala.

+0

Cảm ơn bạn, tôi đã không mong đợi tôi phải gọi ngay cả khi tổng hợp " constructor". – greenoldman

6

Các constructor mặc định là một trong những bạn xác định khi bạn khai báo lớp học của bạn

Ex:

class greeting(name:String) { ... } 

Bạn cũng có thể xác định constructor mặc định để không chứa tham số như trong mã của bạn

class greeting { ... } 

Sau đó, bạn có thể thêm các hàm tạo khác. Tất cả các hàm tạo mà bạn thêm vào lớp cần gọi một hàm tạo khác làm câu lệnh đầu tiên của hàm tạo. Nếu bạn bỏ qua rằng bạn nhận được "điều này dự kiến ​​nhưng định danh được tìm thấy".

Chúng ta hãy xem một ví dụ:

class classconstructor { 
    var iter:Int = 0  
    def this(it:Int) = {  
     this() 
     iter = it; 
     moveNext(); 
    } 
    def moveNext() = { 
     println(iter) 
    } 
} 

object App 
{ 
    def main(args:Array[String]) 
    { 
     val x = new classconstructor() 
     val y = new classconstructor(200)  
    } 
} 

Trong đoạn mã trên classconstructor mới() không làm gì vì các nhà xây dựng có sản phẩm nào không có cơ thể. và trình tạo lớp mới (200) thực hiện hàm tạo rỗng + phần tử mới, nơi bạn có thể thêm mã bổ sung, chẳng hạn như gọi hàm moveNext(). Trong trường hợp này, bản in này sẽ in 200 đến bảng điều khiển.

+0

Cả hai câu trả lời đều tuyệt vời và tổng cộng tất cả các vấn đề. Tuy nhiên tôi có thể đánh dấu là câu trả lời chỉ có một :-(Tôi hy vọng bạn không nhớ, tôi biết ơn dù sao. – greenoldman

+0

Bạn đang chào đón. Đừng lo. –

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