ความเข้าใจในปัจจุบันของฉันเกี่ยวกับการใช้งานมรดกคือควรขยายชั้นเรียนเฉพาะเมื่อมีความสัมพันธ์แบบ IS-A หากคลาสพาเรนต์สามารถมีประเภทลูกที่เฉพาะเจาะจงเพิ่มเติมด้วยฟังก์ชันการทำงานที่แตกต่างกัน แต่จะแบ่งปันองค์ประกอบทั่วไปที่มีนามธรรมในผู้ปกครอง
ฉันกำลังถามความเข้าใจนั้นเพราะสิ่งที่อาจารย์ Java ของฉันแนะนำให้เราทำ เขาแนะนำว่าสำหรับJSwingแอปพลิเคชันที่เรากำลังสร้างในชั้นเรียน
หนึ่งควรขยายทุกJSwingชั้นเรียน ( JFrame, JButton, JTextBoxฯลฯ ) ในชั้นเรียนที่กำหนดเองแยกต่างหากและระบุ GUI การปรับแต่งที่เกี่ยวข้องในพวกเขา (เช่นขนาดส่วนประกอบฉลากส่วนประกอบ ฯลฯ )
จนถึงตอนนี้ดีมาก แต่เขาก็ยังแนะนำต่อไปว่า JButton ทุกคนควรมีคลาสแบบขยายที่กำหนดเองของตนเองแม้ว่าปัจจัยที่แตกต่างเท่านั้นคือฉลากของพวกเขา
สำหรับเช่นหาก GUI มีสองปุ่มโอเคและยกเลิก เขาแนะนำให้ขยายเวลาดังต่อไปนี้:
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);
}
}
อย่างที่คุณเห็นความแตกต่างเพียงอย่างเดียวคือในsetTextฟังก์ชั่น
ดังนั้นการปฏิบัติมาตรฐานนี้คืออะไร?
Btw หลักสูตรที่กล่าวถึงนี้เรียกว่าBest Programming Practices ใน Java
[ตอบจากศาสตราจารย์]
ดังนั้นฉันจึงพูดถึงปัญหากับอาจารย์และยกประเด็นทั้งหมดที่ระบุไว้ในคำตอบ
เหตุผลของเขาคือ subclassing ให้โค้ดที่นำมาใช้ซ้ำได้ในขณะที่ปฏิบัติตามมาตรฐานการออกแบบ GUI ตัวอย่างเช่นหากผู้พัฒนาได้ใช้กำหนดเองOkayและCancelปุ่มในหนึ่งหน้าต่างมันจะง่ายกว่าที่จะวางปุ่มเดียวกันใน Windows อื่น ๆ เช่นกัน
ฉันได้รับเหตุผลที่ฉันคิดว่า แต่ก็ยังคงเป็นเพียงการใช้ประโยชน์จากการสืบทอดและทำให้รหัสเปราะบาง
หลังจากนั้นนักพัฒนาซอฟต์แวร์รายใดสามารถโทรsetTextไปที่Okayปุ่มและเปลี่ยนโดยไม่ได้ตั้งใจ คลาสย่อยจะกลายเป็นความรำคาญในกรณีนั้น
JButtonและเรียกวิธีการสาธารณะในนวกรรมิกเมื่อคุณสามารถสร้างJButtonและเรียกวิธีการสาธารณะแบบเดียวกันเหล่านั้นนอกห้องเรียน?