Tôi đã thấy điều này xuất hiện ở đây một vài lần, nhưng trong các bài đăng tôi đã thấy, không ai giải thích nó. Tại sao tôi không nên mở rộng JFrame (hoặc bất kỳ thành phần nào)? Có những điều kiện mà tôi nên mở rộng một thành phần, hoặc đây là một quy tắc vững chắc mà bạn không?Tại sao bạn không nên mở rộng JFrame và các thành phần khác?
Trả lời
Nói chung, việc mở rộng thành phần có xu hướng được thực hiện nghiêm ngặt để sử dụng thành phần. Điều này hạn chế các tùy chọn của bạn theo những cách không cần thiết về thiết kế, do đó các lớp của bạn không thể mở rộng các lớp khác nhau, bạn không thể ẩn các phương thức của JFrame gây khó khăn hơn để duy trì và dễ dàng kích hoạt lỗi không mong muốn hơn khi sử dụng lớp .
Thông thường ý định là sử dụng nghiêm ngặt lớp để vẽ khung và bố cục được ưu tiên hơn thừa kế. Điều đó đang được nói, phân lớp phải ổn khi bạn định lớp con của bạn thêm chức năng dự án cụ thể vào Khung (chẳng hạn như các phương thức tiện lợi và tương tự), nơi lớp con sẽ được sử dụng thay vì Khung chính, nhưng được sử dụng như một khung nói chung, không phải là khung nhìn của một khung cụ thể trong ứng dụng.
Nếu ứng dụng của bạn REALLY chỉ là một JFrame, hãy tiếp tục và mở rộng nó. Tuy nhiên, tốt nhất bạn nên sử dụng thành phần đối tượng thay vì thừa kế nếu bạn chỉ đơn giản là sử dụng một JFrame.
Nếu đối tượng của bạn mở rộng một số đối tượng khác, bạn sẽ không có lựa chọn nào trong vấn đề, làm ví dụ.
Tôi không thấy vấn đề miễn là bạn đang mở rộng lớp và có thể bảo toàn các khía cạnh "là một" của kế thừa.
Khi bạn mở rộng một JPanel nhưng đối tượng mới của bạn không phải là chuyên môn thực sự của JPanel, đó là nơi bạn gặp rắc rối. Nhưng nếu bạn tạo một SpeciallyFormattedJLabel
mới mở rộng JLabel
, tôi thấy không có vấn đề gì với điều đó.
Ưu tiên thành phần trên thừa kế. Tất cả những lý do thông thường. Thành phần buộc ít phụ thuộc hơn giữa mã.
Swing và sự kiện AWT, các thành phần phức tạp một cách phức tạp. Bạn không muốn nhận được vào mớ hỗn độn đó. Bạn có thể dễ dàng ghi đè lên các phương thức một cách vô tình. Trong trường hợp bạn cần phải ghi đè lên các phương thức, rất khó để xem nơi được thực hiện nếu nó nằm trong số mã bình thường.
isValid là một cổ điển để ghi đè vô tình – willcodejavaforfood
Tôi biết đây là một bài đăng cũ, nhưng tôi mới bắt gặp nó và tôi phải nói với bạn ... mở rộng giới hạn các tùy chọn gọi những hành động nhất định của đối tượng. Tôi thực sự viết lại một số phần của mã ngay bây giờ để thoát khỏi những thiệt hại đã mở rộng đã gây ra cho tôi. Trừ khi tôi đang viết một chương trình một tập tin, tôi sẽ không sử dụng mở rộng một lần nữa.
- 1. Tại sao các phần mở rộng JPEG khác nhau?
- 2. Mở rộng JFrame
- 3. Tại sao nên kiểm tra các thành phần bower?
- 4. Tại sao người dùng cocos2d-iphone nên tránh sử dụng phần mở rộng tệp @ 2x?
- 5. Tôi có nên thêm các thành phần vào JFrame hoặc vào contentPane của nó không?
- 6. Xuất bản các phần mở rộng .cs và các phần khác trong IIS 7.0
- 7. Tại sao JFrame ban đầu đòi hỏi getContentPane() để thêm các thành phần
- 8. Tại sao Vim lưu tệp bằng phần mở rộng ~?
- 9. Tại sao tôi không nên gọi setVisible (true) trước khi thêm các thành phần?
- 10. Mở rộng các thành phần tùy chỉnh MXML qua MXML
- 11. Sự khác biệt giữa các thành phần, mô-đun, phần mở rộng và các plugin trong Joomla
- 12. Tại sao bạn nên khóa luồng?
- 13. Tại sao Node.js có thể mở rộng?
- 14. Tại sao mô-đun gắn trong python đôi khi tạo các tệp có các phần mở rộng khác nhau?
- 15. Các lớp ngầm có nên mở rộng AnyVal không?
- 16. Sự khác biệt giữa phần mở rộng và plugin của Firefox là gì?
- 17. Mở rộng phương thức .val() của jQuery thành các phần tử không nhập
- 18. Cách tạo nút JFrame mở một lớp JFrame khác trong Netbeans?
- 19. Tại sao các thành phần trong Stellar.js không di chuyển?
- 20. sự khác biệt giữa các thành phần, mở rộng & module trong Yii
- 21. Mở một JFrame mới
- 22. Sự khác biệt giữa các Mô-đun và phần mở rộng trong Yii
- 23. Bạn có thể hiển thị tệp không có phần mở rộng .jsp dưới dạng JSP không?
- 24. Tại sao FireFox không bao gồm phần mở rộng .xml khi tải xuống tệp?
- 25. Tạo thành phần sao chép các giá trị trường từ một thành phần khác
- 26. Chuyển đổi một lớp học thành một phần mở rộng
- 27. Tại sao chúng ta không sử dụng phần mở rộng .class với lệnh "java"?
- 28. tại sao tệp tiêu đề STL không có phần mở rộng?
- 29. Tại sao không đọc phần mở rộng macro phổ biến để chạy (đọc)?
- 30. Thành ngữ nào (nếu có) bạn muốn đặt tên cho tham số "này" cho các phương thức mở rộng trong C# và tại sao?
Đồng ý. Đây là swing, bạn phải mở rộng các thành phần để có được hành vi sơn. – akarnokd
@ kd304 * "để có được hành vi sơn." * Chúng ta có thể thực hiện 'hành vi sơn' trong một 'BufferedImage' .. –