2009-07-17 28 views
25

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

23

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.

4

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ụ.

+1

Đồ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

+1

@ 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' .. –

2

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 đó.

9

Ư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.

+4

isValid là một cổ điển để ghi đè vô tình – willcodejavaforfood

0

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.

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