2011-11-06 34 views

Trả lời

8

Không, bạn không thể, vì nó vi phạm đóng gói. Bạn đang bỏ qua hành vi cha mẹ của bạn, vì vậy C là nghĩa vụ phải mở rộng B, nhưng bạn đang bỏ qua điều này.

Vui lòng xem Jon Skeets câu trả lời tuyệt vời cho cùng một câu hỏi Why is super.super.method(); not allowed in Java?.

Xin lưu ý rằng bạn có thể truy cập trường theo phản ánh, nhưng bạn không muốn làm điều đó.

3

Không. Và tôi sẽ để nó ở đó, nhưng dường như SO muốn tôi tiếp tục với 30 ký tự.

+11

Nếu bạn tình cờ biết lý do tại sao điều này là không thể, đó có thể là một cái gì đó để lấp đầy 30 nhân vật :) – arsenbonbon

17

Không, nhưng bạn có thể làm điều gì đó tương tự với nhiều đặc điểm thừa kế:

trait A { def foo = "from A" } 

class B extends A { override def foo = "from B" } 

class C extends B with A { 
    val b = foo   // "from B" 
    val a = super[A].foo // "from A" 
} 
+0

Và tại sao điều này không vi phạm đóng gói như @Matthew nói trong câu trả lời của ông? – MaxNevermind

+1

Trong ví dụ này, lớp 'C' mở rộng một cách rõ ràng' A', vì vậy nó sẽ trực tiếp truy cập hành vi 'A'. Thành thật mà nói, ví dụ này có vẻ kỳ lạ, và tôi không chắc đó là phong cách tốt. –

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