เหตุใด Windows Forms / Swing frameworks จึงสนับสนุนการสืบทอดแทนที่จะเป็น Composition


12

วันนี้ศาสตราจารย์ของฉันคนหนึ่งให้ความเห็นว่าเขาพบว่ามันแปลกที่ในขณะที่ปรัชญาของ SWT เป็นหนึ่งในการควบคุมของคุณเองโดยการจัดองค์ประกอบสวิงดูเหมือนว่าจะสนับสนุนมรดก

ฉันแทบไม่ได้ติดต่อกับเฟรมเวิร์กทั้งคู่ แต่จากสิ่งที่ฉันจำได้ในแบบฟอร์ม Windows ของ C # มักจะขยายการควบคุมเช่นเดียวกับ Swing

โดยทั่วไปแล้วคนมักจะชอบแต่งเพลงมากกว่าการถ่ายทอดทางพันธุกรรมทำไมคนใน Swing / Windows Forms จึงไม่ชอบการแต่งเพลงมากกว่าการถ่ายทอดทางพันธุกรรม?


2
มีการเปลี่ยนแปลงมากมายในช่วง 15-20 ปีที่ผ่านมา API เหล่านั้นมีอยู่ทั่ว เอ็นจิ้นการแสดงผลไม่ได้มีกาว XML เวทมนตร์เพื่อผูกวัตถุบนหน้าจอกับอินสแตนซ์ของคลาสคอนกรีตใด ๆ "ย้อนกลับไปในวัน";)

1
รหัสสวิงส่วนใหญ่ฉันเห็นว่าใช้ส่วนขยายตามองค์ประกอบ ฉันไม่แน่ใจว่าศาสตราจารย์ของคุณกำลังรับข้อมูลของเขาอยู่ที่ไหน

ตัวฉันเองเคยเห็นการสวิงบนอินเทอร์เน็ตเป็นจำนวนมากพร้อมการสืบทอดมากกว่าการแต่งเพลง แต่รูปแบบ windows ถูกนำมาใช้จริง ๆ แล้วสืบทอดมาเกือบทั้งหมด!
elysium กลืนกิน

คำตอบ:


7

JComponentทำให้ฟังก์ชั่นมากมาย หากJComponentมีการใช้อินเทอร์เฟซและส่วนประกอบกับองค์ประกอบองค์ประกอบที่เรียบง่ายจะต้องมีวิธีการห่อหุ้มสิ่งเล็กน้อยเช่น

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

นอกจากนี้ยังมีเหตุผลที่มีประสิทธิภาพเพื่อต้องการมรดกมากกว่าองค์ประกอบ - เอาชนะค่าใช้จ่ายอะไร (สมมติว่าไม่มีsuperการโทร) INVOKEVIRTUALในขณะที่องค์ประกอบของค่าใช้จ่ายเพิ่ม ฉันไม่รู้ว่าสิ่งนี้มีอิทธิพลต่อการออกแบบของ Swing หรือไม่ แต่เป็นปัญหาใหญ่สำหรับคลาสคอลเลกชัน


2

Swing Framework ได้รับการออกแบบตามรูปแบบการออกแบบคอมโพสิต ได้รับการยอมรับว่ามีจำนวนมากในนั้น แต่คุณมักจะเขียนแบบฟอร์มของคุณเองโดยใช้องค์ประกอบ นั่นคือรูปแบบเป็นองค์ประกอบของภาชนะบรรจุระดับกลางและการควบคุม


"นั่นคือรูปแบบคือองค์ประกอบของคอนเทนเนอร์และตัวควบคุมระดับกลาง" แน่ใจ แต่สิ่งที่ฉันเห็นบ่อยๆคือเมื่อคนต้องการสร้างหน้าต่างของตัวเอง (หรืออะไรก็ตามที่เรียกว่าในการแกว่ง) พวกเขาจะได้รับมรดกจากคลาสหน้าต่างแทนที่จะใช้การแต่งเพลง
elysium กลืนกิน

@deveded elysium นั่นเป็นเรื่องจริง แต่เพื่อสร้างรูปแบบพวกเขาจะใช้องค์ประกอบ ดังนั้นมันจึงเป็นมรดกเล็กน้อยและมีองค์ประกอบมากมาย

@ ได้รับการพัฒนาฉันคิดว่าเป็นกรณีของคนที่ไม่ทราบว่าการสอนที่พวกเขาใช้นั้นไม่ได้เป็นไปตามแนวปฏิบัติที่ดีที่สุดเพราะมันเป็นเรื่องง่าย
Peter Taylor

1

ด้วย Java มันง่ายมากที่จะลงเอยด้วยการใช้มรดกเพราะทุกอย่างเป็นเสมือนจริง ต้องการแก้ไข "คุณสมบัติ" ใน JTable / JFrame หรือไม่ ขยายออกไปแทนที่วิธีการแก้ปัญหาแล้วใช้ Table / Frame ของคุณทุกที่แทน

ฉันคิดว่าด้วยสิ่งต่าง ๆ เช่น WPF ที่การเชื่อมโยงข้อมูลเป็นคุณสมบัติหลักของการออกแบบทำให้การจัดวางองค์ประกอบง่ายกว่าการสืบทอด


คุณหมายถึงอะไรกับ "ทุกสิ่งเป็นเสมือนจริง "?
Jonas

ใน java ทุกวิธีเป็นเสมือนโดยปริยาย (สามารถแทนที่) ใน C # คุณจะต้องประกาศอย่างชัดแจ้งวิธีการเป็นและแทนที่คุณอย่างชัดเจนประกาศว่ามันเป็นvirtual overrideในจาวาคุณสามารถแทนที่สิ่งที่คุณเห็นและคุณสามารถเพิ่มการมองเห็นในคลาสย่อย (คุณสามารถทำให้วิธีการป้องกันเป็นสาธารณะในคลาสย่อย!)
John Gardner

โปรดทราบว่าคุณจะไม่สามารถแทนที่finalวิธีการใน Java finalแม้ว่าระดับฐานตัวเองไม่ได้
perp

นั่นเป็นความจริง @perp แต่ใน java คุณต้องออกไปให้พ้นทาง (เพิ่มขั้นสุดท้าย) เพื่อป้องกันเสมือน C # เป็นวิธีที่ตรงกันข้ามคุณต้องออกไปเป็นเสมือนจริง และเปอร์เซ็นต์เล็กน้อยมากของรันไทม์ Java มาตรฐานถูกทำเครื่องหมายสุดท้าย
John Gardner

1

ในจาวาที่มีประสิทธิภาพรายการ 17, Bloch กล่าวถึงคลาสที่ออกแบบมาสำหรับการสืบทอด จุดเด่นของเรื่องนี้คือวลีที่นำไปใช้งานนี้ คุณจะได้เห็นมันในชั้นเรียนเช่นและJTable JInternalFrameมันเป็นตัวชี้วัดหนึ่งของการสืบทอดโดยการออกแบบในสวิง


-2

จาก C # 3.5 เรามีแนวคิดที่เรียกว่าเป็นวิธีการขยายที่ช่วยให้แนวคิดของการประกอบกว่าการสืบทอด

ในกระบวนการนี้เราใช้ฟังก์ชันการทำงานเพิ่มเติมกับคลาสที่มีอยู่เพียงแค่เพิ่มคลาสส่วนขยายที่แสดงคุณสมบัติใหม่ให้กับคลาสที่มีอยู่

คุณสามารถดูรายละเอียดเพิ่มเติมได้ที่นี่


ฉันไม่เห็นความเกี่ยวข้องกับการสร้างคลาสควบคุม WinForms ใหม่ คุณสามารถทำอย่างละเอียด?
Peter Taylor

@Peter: นี่ไม่เกี่ยวข้องกับคลาสของฟอร์ม windows เท่านั้น สิ่งนี้สามารถใช้ได้จากรหัสของเราด้วย คุณสามารถขยายคลาสใด ๆ ที่มีอยู่ได้โดยเพียงแค่เพิ่มคลาสแบบสแตติกแล้วเพิ่มวิธีการใหม่ด้วยอาร์กิวเมนต์ที่ 1 เช่นนี้เพื่อให้วัตถุพื้นฐานสามารถเชื่อมโยงกับ หลังจากที่คุณรวบรวมรหัสคุณจะได้รับวิธีการเพิ่มใหม่เป็นวิธีการของชั้นฐานตัวเอง นี่คือสิ่งที่รัฐองค์ประกอบ หวังว่าฉันขวา ..
Saravanan

1
ฉันรู้ว่าวิธีการขยายคืออะไรและพวกเขาค่อนข้างมีประโยชน์ในบางครั้ง แต่คำถามนี้เกี่ยวกับวิธีการต่าง ๆ ในการสร้างคลาสใหม่
Peter Taylor

@ ปีเตอร์: จากนั้นฉันสามารถชี้ไปที่การใช้คลาสบางส่วนเท่านั้นนอกเหนือไปจากความเข้าใจของฉัน C # ไม่มีคุณสมบัติที่น่าทึ่งอื่น ๆ ถ้าคุณรู้เรื่องใดโปรดแจ้งให้เราทราบ
Saravanan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.