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()
và 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
Trả lời
Nếu bạn biết rằng thing
chứa một Subclass
, bạn có thể làm:
((Subclass) thing).specialMethod()
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
Bạn phải gõ, hoặc đúc điều cần subclass. Vì vậy:
Subclass thing = new Subclass();
hay:
((Subclass) thing).specialMethod();
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.
Câu lệnh 'if' đó có thể có' else' ... –
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.
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ó:
- Phương pháp này sai địa điểm.
- Mã gọi phương thức ở sai địa điểm.
- Phân lớp không được mở rộng lớp khác. Tốt nhất là prefer composition over inheritance. Và khi kế thừa, mã phải theo sau Liskov substitution principle.
- Các lớp học là non-cohesive, chúng có nhiều hơn one responsibility và chúng phải được chia thành nhiều lớp.
chỉ cần thay đổi nó thành "vấn đề thiết kế có thể" và tôi đồng ý hoàn toàn. – David
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".
- 1. Java: Gọi một phương pháp siêu trong đó kêu gọi một phương pháp ghi đè
- 2. Gọi một lớp cơ sở phương pháp
- 3. Phương pháp gọi ma thuật trong Java
- 4. Gọi một phương thức phân lớp từ siêu lớp
- 5. gọi phương pháp khác từ phương pháp chính trong java
- 6. Gọi Java Phương pháp Generic
- 7. Chạy một phương pháp trước và sau khi một phương pháp gọi trong Java
- 8. Gọi dụ phương pháp từ phương pháp lớp
- 9. Làm thế nào để gọi một phương thức java dựa trên một loại phân lớp?
- 10. Java gọi phương thức lớp con khi cố gắng sử dụng phương pháp lớp cha
- 11. Java Đúc với phương pháp kêu gọi
- 12. java gọi một phương thức từ một lớp khác
- 13. XSLT gọi java phương pháp dụ
- 14. Gọi siêu phương pháp lớp tự động
- 15. Mục tiêu-C - Phương pháp ghi đè trong phân lớp
- 16. Gọi phương pháp không tĩnh của một lớp
- 17. Gọi một phương pháp ghi đè từ lớp cơ sở
- 18. Java - Phương pháp Gọi & Thực hiện
- 19. Cách gọi phương thức lớp trừu tượng trong java
- 20. Java: `Phương pháp static`
- 21. Gọi một phương pháp siêu trong PHP
- 22. Phương pháp gọi trong JPA
- 23. Phương pháp gọi trên lớp được bao gồm trong Ruby
- 24. Phương thức lớp chính() có thể được gọi trong một lớp khác trong java
- 25. php yêu cầu gọi lớp từ bên trong phương pháp
- 26. lấy tên lớp gọi từ phương pháp tĩnh thừa hưởng
- 27. Phương pháp riêng trong siêu lớp có bị ghi đè trong phân lớp không?
- 28. OOP trong Java: Lớp thừa kế với phương pháp chuỗi
- 29. Java hai varargs trong một phương pháp
- 30. bên trong truy cập lớp phương pháp lớp bên ngoài, cùng một phương pháp tên
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. –