2015-05-03 41 views
8

Tôi đang học Scala bằng cách thực hiện các bài tập từ cuốn sách "Scala for the Impatient". Một tập thể dục hỏi rằng:Ý nghĩa của từ khóa được bảo vệ trong định nghĩa lớp trong Scala là gì?

File Stack.scala chứa các định nghĩa class Stack[+A] protected (protected val elems: List[A])

Giải thích ý nghĩa của protected từ khóa.

Ai đó có thể giúp tôi hiểu điều này? protected rõ ràng là có ý nghĩa đối với các biến thành viên nhưng hàm ý của nó trong định nghĩa lớp là gì?

Trả lời

6

Trong Scala, viết

class Stack[+A](elems: List[A]) 

cũng thực hiện một constructor mặc định. Nếu bạn biết Java, sau đó trong Java này sẽ là một cái gì đó giống như

class Stack<A> { 
    private List<A> elems; 
    public Stack<A>(List<A> elems){this.elems = elems;} 
} 

Bây giờ, bạn có hai protected từ khóa trong ví dụ của bạn:

  • protected val elems: List[A]
  • protected (/*...*/)

Đầu tiên làm cho biến số elems được bảo vệ, có nghĩa là nó chỉ có thể được truy cập (và ẩn) bởi các lớp con của Stack[+A].

Phương thức thứ hai làm cho hàm tạo được bảo vệ, nghĩa là phiên bản Stack mới chỉ có thể được tạo bởi các lớp con của Stack[+A].

Một lần nữa, các mã Java tương đương sẽ là một cái gì đó giống như

class Stack<A> { 
    protected List<A> elems; 
    protected Stack<A>(List<A> elems){this.elems = elems;} 
} 
+0

Cảm ơn bạn! Ý nghĩa của '+ A' là gì? –

+1

Nó có nghĩa là 'Stack' là biến thể trong tham số generic' A', có nghĩa là 'Stack [Dog]' là một 'Stack [Animal]'. Nếu bạn không thêm dấu cộng, thì phép gán 'val x: Stack [Animal] = Stack [Dog] (Dog (" Pluto "))' là bất hợp pháp. –

+0

Yeah trong Java, 'Danh sách ' không phải là 'Danh sách '. Vì vậy, contravariance là '-A' sau đó? Nếu vậy, tôi đoán người ta có thể viết 'class stack [+ A] (elems: List [-A])'? –

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