2010-04-06 50 views
23

thể trùng lặp:
Why is super.super.method(); not allowed in Java?Java Cách gọi phương thức của cha mẹ lớn?

Giả sử tôi có 3 lớp A, BC, mỗi người mở rộng trước đó.

Làm cách nào để gọi mã số trong A.myMethod() từ C.myMethod() nếu B cũng triển khai myMethod?

class A 
{ 
    public void myMethod() 
    { 
    // some stuff for A 
    } 
} 

class B extends A 
{ 
    public void myMethod() 
    { 
    // some stuff for B 
    //and than calling A stuff 
    super.myMethod(); 
    } 
} 

class C extends B 
{ 
    public void myMethod() 
    { 
    // some stuff for C 
    // i don't need stuff from b, but i need call stuff from A 
    // something like: super.super.myMethod(); ?? how to call A.myMethod(); ?? 
    } 
} 
+0

Tại sao bạn làm điều đó? Bạn có thể đưa ra một ví dụ không? – Macarse

Trả lời

18

Bạn không thể. Đây là cố ý.

Lớp B cung cấp giao diện (như trong khái niệm, không phải từ khóa Java) cho các lớp con. Nó đã bầu không cho phép truy cập trực tiếp vào chức năng của A.myMethod. Nếu bạn yêu cầu B để cung cấp chức năng đó, thì hãy sử dụng một phương pháp khác cho nó (tên khác, đặt tên là protected). Tuy nhiên, nó có lẽ là tốt hơn để "thích thành phần hơn thừa kế".

+0

Xin cảm ơn các bạn! tôi sẽ cố gắng làm lại thiết kế của mình. – Arkaha

+0

Arkaha, hãy xem câu trả lời của tôi cho câu hỏi của bạn. Đó là cú pháp có thể gọi một phương thức được xác định bởi một siêu lớp mà nó không phải là tổ tiên trực tiếp của bạn (của bạn * siêu *). Nhưng bạn cần phải có một lý do hợp lệ để làm như vậy. –

0

Tôi không chắc chắn bạn có thể. Java làm cho tất cả các phương thức ảo theo mặc định. Điều này có nghĩa là giải pháp đơn giản nhất sẽ không hoạt động: Khai báo biến số A, chỉ định trường hợp C của bạn cho nó và gọi myMethod sẽ dẫn đến việc gọi số C.myMethod.

Bạn có thể cố gắng phản ánh loại A và gọi phương thức trực tiếp. Thật thú vị khi thấy điều gì xảy ra trong trường hợp này, nhưng tôi sẽ ngạc nhiên nếu công văn ảo không xảy ra ...

2

Bạn không thể, và bạn không nên.

Đây là dấu hiệu của thiết kế kém. Đổi tên một phương thức hoặc bao gồm các chức năng phổ biến cần thiết trong một phương thức khác hoặc một lớp tiện ích.

+1

Phản ánh * cũng * không cung cấp cách để làm điều này, các quy tắc thông thường của đa hình thời gian chạy sẽ ** vẫn áp dụng **. Bạn thậm chí không thể thực hiện 'super.myMethod()' bằng cách sử dụng sự phản chiếu, hãy để một mình lý thuyết 'super.super.myMethod()'. –

+0

chính xác. đã cập nhật. – Bozho

+0

Không nhất thiết, bạn cần phải làm điều đó khi bạn định nghĩa các lớp bên trong (ví dụ, xác định người nghe hành động trong Swing hoặc gọi lại lớp.) Bên ngoài các tình huống như vậy, có, đó là thiết kế xấu, nhưng * tự nó * nó không phải. Cú pháp Java hỗ trợ nó dù sao đi nữa (xem câu trả lời của tôi cho câu hỏi của Arkaha.) –

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