2010-03-12 31 views
5

Tôi có một đối tượng của một phân lớp mở rộng siêu lớp của nó. Có một phương thức ghi đè trong lớp con có thể được gọi bằng cách sử dụng đối tượng. Có thể gọi hàm của lớp cha bằng cách sử dụng đối tượng lớp con không?Truy cập chức năng siêu hạng bằng cách sử dụng đối tượng lớp con

package supercall; 

public class Main { 

    public static void main(String[] args) { 
     SomeClass obj = new SubClass(); 
     obj.go(); //is there anything like, obj.super.go()? 
    } 

} 

class SomeClass { 
    SomeClass() { 

    } 
    public void go() { 
     System.out.println("Someclass go"); 
    } 
} 

class SubClass extends SomeClass { 
    SubClass() { 

    } 
    @Override 
    public void go() { 
     System.out.println("Subclass go"); 
    } 
} 

Hãy xem xét mã ở trên.

Ở đây nó in

Subclass đi

. Thay vào đó tôi phải in

lớp cha đi

.

Trả lời

15

Không, không thể, và nếu bạn nghĩ bạn cần, hãy suy nghĩ lại thiết kế của bạn. Toàn bộ điểm ghi đè một phương pháp là thay thế chức năng của nó. Nếu một lớp khác biết nhiều về hoạt động bên trong của lớp đó, bạn sẽ hoàn toàn giết chết đóng gói.

2

Thay vì:

System.out.println("Subclass go"); 

Viết

super.go(); 

(Hoặc, bạn biết đấy, chỉ không thực hiện phương pháp đó ...).

+0

Vâng. Nhưng đôi khi tôi cũng sẽ sử dụng phương thức của lớp con. Không phải là nó có thể gọi phương thức của siêu lớp theo cách khác sao? một cái gì đó như obj.super.go() ??? Tất nhiên, đây là một cấu trúc sai. Tôi có nghĩa là một cái gì đó tương tự ?? – bdhar

+0

Ohh người đàn ông ... tôi vừa viết câu trả lời đó (không được đăng) ... shit !!! – RubyDubee

+1

@bdhar: Vâng, bạn chỉ có thể gọi 'super'. Nhưng bạn cần phải thực hiện cuộc gọi đó từ * trong * lớp học. Nó không thể được thực hiện bên ngoài. –

0

Có cách nào để đạt được điều này không? Không, không có.

Khi chạy JVM sẽ chọn các phương thức để gọi dựa trên loại cá thể (đó là tính đa hình cho bạn), không dựa trên loại được khai báo.

Ví dụ của bạn là một cá thể lớp con, do đó, phương thức go() trong lớp con sẽ được gọi.

0

Một cách có thể là thực hiện cuộc gọi lớp con với việc thực hiện siêu lớp. Nhưng tôi cho rằng đó không phải những gì bạn muốn?

class SubClass extends SomeClass {  
SubClass() {}  
    @Override  
    public void go() {  
     super.go 
    } 
} 
+0

@Steve .. Gọi hàm superclass bằng siêu từ khóa thực sự là cách chính xác. Những gì tôi muốn biết là nếu có bất kỳ cách nào khác để gọi các superclass go() phương pháp sử dụng "obj" là tài liệu tham khảo ?? –

3

Tại đây, in Lớp con đi . Thay vào đó, tôi phải in Siêu lớp đi

Được rồi, đừng ghi đè lên phương thức go @ subclass, nó sẽ gọi triển khai siêu lớp.

Nếu bạn muốn chạy siêu triển khai và có một số mã bổ sung khác @ phân lớp, bạn gọi super.go(); và sau đó chạy một số câu lệnh khác.

Không sao, vì bạn đang sử dụng lại mã đã viết, bạn không nên sao chép-dán mã từ siêu lớp và đặt mã đó thành người đăng ký dưới dạng sao chép mã. Nhưng nếu mục tiêu của bạn là thay đổi hoàn toàn hành vi, thì đừng gọi siêu số

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