Sự hiểu biết hiện tại của tôi về việc thực hiện Kế thừa là người ta chỉ nên mở rộng một lớp nếu có mối quan hệ IS-A . Nếu lớp cha có thể có thêm các kiểu con cụ thể hơn với chức năng khác nhau nhưng sẽ chia sẻ các phần tử phổ biến được trừu tượng hóa trong lớp cha.
Tôi đang nghi ngờ sự hiểu biết đó vì những gì giáo sư Java của tôi khuyên chúng ta nên làm. Ông đã khuyến nghị rằng đối với một JSwing
ứng dụng chúng tôi đang xây dựng trong lớp
Người ta phải mở rộng tất cả JSwing
các lớp học ( JFrame
, JButton
, JTextBox
, vv) vào các lớp tùy chỉnh riêng biệt và chỉ định GUI tùy biến có liên quan đến họ (như kích thước thành phần, thành phần nhãn, vv)
Cho đến nay vẫn tốt, nhưng ông tiếp tục khuyên rằng mỗi JButton nên có lớp mở rộng tùy chỉnh riêng của mình mặc dù yếu tố phân biệt duy nhất là nhãn của họ.
Ví dụ: Nếu GUI có hai nút Okay và Hủy . Ông khuyến nghị họ nên được gia hạn như sau:
class OkayButton extends JButton{
MainUI mui;
public OkayButton(MainUI mui) {
setSize(80,60);
setText("Okay");
this.mui = mui;
mui.add(this);
}
}
class CancelButton extends JButton{
MainUI mui;
public CancelButton(MainUI mui) {
setSize(80,60);
setText("Cancel");
this.mui = mui;
mui.add(this);
}
}
Như bạn có thể thấy sự khác biệt duy nhất là trong setText
chức năng.
Vậy đây có phải là tiêu chuẩn thực hành?
Btw, khóa học mà điều này đã được thảo luận được gọi là Thực tiễn lập trình tốt nhất trong Java
[Trả lời từ Giáo sư]
Vì vậy, tôi đã thảo luận vấn đề với giáo sư và nêu ra tất cả các điểm được đề cập trong các câu trả lời.
Lý do của ông là phân lớp cung cấp mã có thể tái sử dụng trong khi tuân theo các tiêu chuẩn thiết kế GUI. Chẳng hạn, nếu nhà phát triển đã sử dụng các nút tùy chỉnh Okay
và các Cancel
nút trong một Cửa sổ, việc đặt các nút tương tự trong các Windows khác cũng sẽ dễ dàng hơn.
Tôi có lý do tôi cho rằng, nhưng vẫn chỉ là khai thác tính kế thừa và làm cho mã dễ vỡ.
Sau đó, bất kỳ nhà phát triển vô tình có thể gọi setText
vào một Okay
nút và thay đổi nó. Lớp con chỉ trở nên phiền toái trong trường hợp đó.
JButton
và gọi các phương thức công khai trong hàm tạo của nó, khi bạn có thể chỉ cần tạo mộtJButton
và gọi các phương thức công khai đó bên ngoài lớp?