2010-04-23 78 views
9

Nếu tôi có một lớp cơ sở Base thing = null; trong đó là một lớp con class Subclass extends Base và tôi xúi giục nó như thing = new Subclass thế nào tôi sẽ gọi một phương thức đó là đặc biệt trong Subclass, nhưng không ở cơ sở? ví dụ: Base chỉ có method() Subclass đã method()specialMethod() phương pháp specialMethod() là người tôi muốn gọi.Gọi một phương pháp phân lớp trong Java

+2

Thông thường đó là một ý tưởng tồi. Nếu bạn biết đối tượng thuộc loại Subclass, thì hãy tham khảo nó như thế và bạn không có vấn đề gì. Nếu phương thức này thực sự thuộc về Base - hãy đặt nó trong Base. –

Trả lời

12

Nếu bạn biết rằng thing chứa một Subclass, bạn có thể làm:

((Subclass) thing).specialMethod() 
+6

Lưu ý rằng nếu điều đó không phải là một 'lớp con', điều này sẽ đánh bom bằng' ClassCastException' ... sử dụng 'instanceof' để kiểm tra nếu' điều' là một 'Lớp con' trước nếu bạn không chắc chắn. – Powerlord

1

Bạn phải gõ, hoặc đúc điều cần subclass. Vì vậy:

 Subclass thing = new Subclass(); 

hay:

 ((Subclass) thing).specialMethod(); 
7

Bạn phải cast nó để có thể gọi phương thức:

Base thing = new SubClass(); 

((SubClass) thing).specialMethod(); 

Nếu bạn phải đối mặt với tình trạng này, nhiều khả năng bạn không có giao diện phù hợp (tập hợp các phương thức phù hợp)

Trước khi đi sâu vào giai đoạn bạn bắt đầu xác nhận tất cả mọi thứ phải biết nếu bạn có thể gọi một phương pháp hoặc không thích ở:

public void x (Base thing) { 
    if(thing.instanceof Subclass) { 
     ((SubClass)thing).specialMethod(); 
    } 
} 

Cân nhắc nếu bạn không cần phải di chuyển các specialMethod lên trong hệ thống phân cấp nên nó thuộc về căn cứ.

Nếu bạn chắc chắn không cần đến nó trong cơ sở, nhưng bạn cần nó trong lớp ít nhất xem xét sử dụng đúng loại:

SubClass thing = ... 
// no need to cast 
thing.specialMethod(); 

Nhưng như mọi khi, điều này phụ thuộc vào những gì bạn đang cố gắng để làm.

+0

Câu lệnh 'if' đó có thể có' else' ... –

3

Khi giao dịch với thừa kế/đa hình trong Java cơ bản có hai loại phôi mà bạn nhìn thấy:

Upcasting:

Superclass x = new Subclass(); 

Đây là tiềm ẩn và không cần một dàn diễn viên cứng vì Java biết rằng mọi thứ mà Superclass có thể làm, số Subclass cũng có thể làm được.

downcasting

Superclass x = new Subclass(); 

Subclass y = (Subclass) x; 

Trong trường hợp này bạn cần làm một dàn diễn viên cứng vì Java là không hoàn toàn chắc chắn nếu điều này sẽ làm việc hay không. Bạn phải an ủi nó bằng cách nói với nó rằng bạn biết những gì bạn đang làm. Lý do là vì lớp con có thể có một số phương thức kỳ lạ mà lớp cha không có.

Nói chung, nếu bạn muốn khởi tạo một lớp để gọi một cái gì đó trong phân lớp của nó, bạn có lẽ chỉ cần khởi tạo lớp con để bắt đầu - hoặc xác định xem phương thức có nên ở trong lớp cha hay không.

16

Những người khác đã đề cập cách truyền đối tượng để nhận câu trả lời cho câu hỏi của bạn, nhưng đặt câu hỏi đó ở địa điểm đầu tiên điểm cho vấn đề thiết kế có thể xảy ra. Một số lý do có thể có:

+1

chỉ cần thay đổi nó thành "vấn đề thiết kế có thể" và tôi đồng ý hoàn toàn. – David

0

cách tiếp cận khác có thể làm như sau:

public abstract class Base { 

    //method() not implemented 

    public abstract void specialMethod(); 
} 

public class Subclass extends Base { 

    //method() not implemented 

    @Override 
    public void specialMethod() { 
     //put your code here 
     System.out.println("specialMethod from Subclass"); 
    } 
} 

Vì vậy, bạn có thể làm:

thing.specialMethod(); 

và nó sẽ cung cấp cho bạn: "specialMethod từ Subclass".

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