Đó là vấn đề bạn muốn vẽ đường thẳng ở đâu. Bạn có thể thiết kế một ngôn ngữ sẽ phát hiện tính hợp lệ của downcast ngầm:
public static void main(String args[]) {
// An implicit upcast
Fruit parent = new Apple();
// An implicit downcast to Apple
Apple child = parent;
}
Bây giờ, hãy trích xuất một phương thức:
public static void main(String args[]) {
// An implicit upcast
Fruit parent = new Apple();
eat(parent);
}
public static void eat(Fruit parent) {
// An implicit downcast to Apple
Apple child = parent;
}
Chúng tôi vẫn tốt. Phân tích tĩnh khó hơn nhiều nhưng vẫn có thể.
Nhưng vấn đề xuất hiện ngay giây phút ai đó thêm vào:
public static void causeTrouble() {
// An implicit upcast
Fruit trouble = new Orange();
eat(trouble);
}
Bây giờ, bạn muốn nâng lỗi ở đâu? Điều này tạo ra một vấn đề nan giải, người ta có thể nói rằng vấn đề đang xảy ra Apple child = parent;
, nhưng điều này có thể bị bác bỏ bởi "Nhưng nó đã hoạt động trước đây". Mặt khác, việc thêm eat(trouble);
gây ra vấn đề ", nhưng toàn bộ quan điểm của đa hình là cho phép chính xác điều đó.
Trong trường hợp này, bạn có thể thực hiện một số công việc của lập trình viên, nhưng bạn không thể làm tất cả mọi cách. Bạn càng nhận được nó trước khi từ bỏ, sẽ càng khó để giải thích những gì đã sai. Vì vậy, tốt hơn hết là tạm dừng càng sớm càng tốt, theo nguyên tắc báo cáo lỗi sớm.
BTW, trong Java, downcast mà bạn mô tả không thực sự là một downcast. Đây là một diễn viên nói chung, có thể đúc táo cũng như cam. Vì vậy, về mặt kỹ thuật, ý tưởng của @ chi đã có ở đây, không có chương trình phát sóng nào trong Java, chỉ có "mỗi lần phát". Sẽ rất hợp lý khi thiết kế một toán tử downcast chuyên dụng, nó sẽ đưa ra lỗi biên dịch khi loại kết quả không thể tìm thấy ở phía dưới từ kiểu đối số của nó. Sẽ là một ý tưởng tốt để làm cho "everycast" khó sử dụng hơn nhiều để ngăn cản các lập trình viên sử dụng nó mà không có lý do chính đáng. XXXXX_cast<type>(argument)
Cú pháp của C ++ xuất hiện trong tâm trí.