2010-10-28 24 views
6

Tôi đang làm bài tập về nhà cho lớp thiết kế hướng đối tượng của mình và tôi đang gặp rắc rối với các đối tượng đồng hành của Scala. Tôi đã đọc ở một vài nơi mà các đối tượng đồng hành được cho là có quyền truy cập vào các phương thức riêng tư của lớp đồng hành của họ, nhưng tôi dường như không thể làm cho nó hoạt động được. (Cũng giống như một lưu ý, thịt của nhiệm vụ phải làm với việc thực hiện một cây tìm kiếm nhị phân, vì vậy tôi không chỉ yêu cầu câu trả lời ...)Tại sao tôi không thể truy cập các phương thức lớp riêng trong đối tượng đồng hành của lớp trong Scala?

Tôi có một đối tượng được cho là tạo ra một thể hiện lớp riêng tư của tôi, BstAtlas (Bst cũng được định nghĩa trong đối tượng Atlas, lấy nó ra cho rõ ràng):

object Atlas {            
    def focusRoom(newRoom:Room,a:Atlas):Atlas = a.helpFocusRoom(newRoom); 

    abstract class Atlas { 
    ... 
    protected def helpFocusRoom(n:Room):Atlas; 
    ... 
    } 

    private class BstAtlas(bst:Bst) extends Atlas { 
    ... 
    protected def helpFocusRoom(newRoom:Room):Atlas = ... 
     // uses some of bst's methods 
    ... 
    } 
} 

Nhưng khi tôi đi để biên dịch, tôi nhận được lỗi sau:

Question23.scala:15: error: method helpFocusRoom cannot be accessed in Atlas.Atlas a.helpFocusRoom(newRoom);

các function helpFocusRoom cần phải được ẩn, nhưng tôi không biết làm thế nào để ẩn nó và vẫn có quyền truy cập vào nó bên trong của đối tượng đồng hành.

Có ai cho tôi biết tôi đang làm gì sai ở đây không?

+0

wow .. Tôi không bao giờ biết có thẻ "bài tập về nhà" – pavanred

Trả lời

9

Vấn đề là các lớp và đối tượng đồng hành không thể lồng nhau như vậy. Để xác định một đối tượng đồng hành, bạn cần định nghĩa lớp bên ngoài phần thân của đối tượng nhưng trong cùng một tệp.

+1

Xin cảm ơn, điều đó có nghĩa là không. Giáo sư nói với chúng tôi trong bài giảng để sử dụng cách lồng nhau lên trên để ẩn chi tiết thực hiện ... Nhưng cách này dường như có cùng một kết quả (và biên dịch, đó là một cộng). – Shaun

5

đối tượng Companion nên bên cạnh đối tượng thật của mình, không chứa nó:

object Example { 
    class C(val i: Int = C.DefaultI) { } 
    object C { protected val DefaultI = 5 } 
} 

scala> (new Example.C).i 
res0: Int = 5 

scala> Example.C.DefaultI 
<console>:11: error: value DefaultI cannot be accessed in object Example.C 
    Example.C.DefaultI 

Ngoài ra, bạn có thể thay đổi phạm vi của từ khóa protected để bao gồm các đối tượng kèm theo:

object Example { 
    def value = (new D).hidden 
    class D(val i: Int = 5) { 
    protected[Example] def hidden = i*i 
    } 
} 

scala> Example.value 
res1: Int = 25 

nhưng ở đây bạn không nên đặt tên cho đối tượng bên ngoài giống như lớp bên trong hoặc bạn sẽ gặp khó khăn khi đề cập đến nó từ bên trong lớp.

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