ภาษาเหล่านี้แตกต่างกันมากโดยเฉพาะในพื้นที่นี้ สมมติว่าคุณมีชั้นเรียน ในกรณีนี้เราจะทำให้ผู้ใช้ควบคุมได้เหมือนกับกล่องข้อความ เรียกว่า UIControl ตอนนี้เราต้องการนำสิ่งนี้ไปไว้ในคลาสอื่น ในกรณีนี้เนื่องจากเราใช้ UI เป็นตัวอย่างเราจะเรียกมันว่าคลาส CleverPanel ตัวอย่าง CleverPanel ของเราต้องการทราบเกี่ยวกับสิ่งต่าง ๆ ที่เกิดขึ้นกับตัวอย่างของ UIControl ด้วยเหตุผลหลายประการ ทำอย่างไร
ใน C # วิธีการพื้นฐานคือการตรวจสอบกิจกรรมต่างๆการตั้งค่าวิธีการที่จะดำเนินการเมื่อมีการเรียกใช้เหตุการณ์ที่น่าสนใจแต่ละเหตุการณ์ ใน Java ซึ่งขาดเหตุการณ์วิธีแก้ปัญหาตามปกติคือการส่งวัตถุด้วยวิธีการจัดการ "เหตุการณ์" ที่หลากหลายไปยังวิธี UIControl:
boolean stillNeedIt = ... ;
uiControl.whenSomethingHappens( new DoSomething() {
public void resized( Rectangle r ) { ... }
public boolean canICloseNow() { return !stillNeedIt; }
public void closed() { ... }
...
} );
จนถึงตอนนี้ความแตกต่างระหว่าง C # และ Java ไม่ได้ลึกซึ้ง อย่างไรก็ตามเรามีอินเทอร์เฟซ DoSomething ที่ไม่จำเป็นใน C # นอกจากนี้อินเทอร์เฟซนี้อาจรวมถึงวิธีการจำนวนมากที่ไม่จำเป็นต้องใช้เวลาส่วนใหญ่ ใน C # เราเพียง แต่ไม่จัดการกับเหตุการณ์นั้น ใน Java เราสร้างคลาสที่ให้การใช้ null สำหรับวิธีการอินเตอร์เฟสทั้งหมด DoSomethingAdapter ตอนนี้เราแทนที่ DoSomething ด้วย DoSomethingAdapter และเราไม่จำเป็นต้องเขียนวิธีการใด ๆ เลยสำหรับการคอมไพล์ใหม่ทั้งหมด เราสิ้นสุดเพียงแค่เอาชนะวิธีการที่เราต้องการเพื่อให้โปรแกรมทำงานได้อย่างถูกต้อง ดังนั้นเราจึงต้องการอินเทอร์เฟซและใช้การสืบทอดใน Java เพื่อจับคู่สิ่งที่เราทำกับเหตุการณ์ใน C #
นี่คือตัวอย่างไม่ใช่การอภิปรายที่ครอบคลุม แต่ให้ข้อมูลเบื้องต้นเกี่ยวกับสาเหตุที่มีการสืบทอดใน Java มากเมื่อเทียบกับ C #
ตอนนี้ทำไม Java ถึงทำงานแบบนี้? มีความยืดหยุ่น วัตถุถูกส่งผ่านไปเมื่อบางสิ่งบางอย่างเกิดขึ้นอาจถูกส่งไปยังเคลเวอร์พาเนลจากที่อื่นอย่างสมบูรณ์ มันอาจเป็นสิ่งที่หลาย ๆ กรณีของเคลเวอร์พาเนลควรผ่านไปยังวัตถุที่คล้ายกับ UIControl ของพวกเขาเพื่อช่วยเหลือวัตถุเคลฟเวอร์วินด์ในบางแห่ง หรือ UIControl สามารถส่งมอบให้กับหนึ่งในองค์ประกอบของมัน
นอกจากนี้แทนที่จะเป็นอะแดปเตอร์อาจมีการใช้งาน DoSomething บางแห่งที่มีโค้ดหลายพันบรรทัดอยู่ด้านหลัง เราสามารถสร้างตัวอย่างใหม่ของสิ่งนั้นและส่งผ่านมันได้ เราอาจต้องแทนที่วิธีหนึ่ง เคล็ดลับทั่วไปใน Java คือการมีคลาสขนาดใหญ่ด้วยวิธีการเช่น:
public class BigClass implements DoSomething {
...many long methods...
protected int getDiameter() { return 5; }
}
จากนั้นใน CleverlPanel:
uiControl.whenSomethingHappens( new BigClass() {
@Override
public int getDiameter() { return UIPanel.currentDiameter; }
} );
แพลตฟอร์ม Java แบบโอเพ่นซอร์สทำสิ่งนี้มากมายซึ่งมีแนวโน้มที่จะผลักดันให้โปรแกรมเมอร์ทำสิ่งต่างๆมากขึ้น - ทั้งคู่เพราะพวกเขาปฏิบัติตามเป็นตัวอย่างและเพื่อใช้งาน ฉันคิดว่าการออกแบบพื้นฐานของภาษาอยู่เบื้องหลังการออกแบบกรอบของ Sun และอยู่เบื้องหลังโปรแกรมเมอร์ Java ที่ใช้เทคนิคเมื่อไม่ได้ใช้กรอบงาน
มันง่ายมากที่จะสร้างคลาสได้ทันทีใน Java คลาสไม่ระบุชื่อหรือตั้งชื่อจะต้องมีการอ้างอิงในบล็อกเล็ก ๆ ของรหัสฝังลึกในวิธีการหนึ่ง มันสามารถสร้างขึ้นใหม่อย่างสมบูรณ์หรือโดยการปรับเปลี่ยนเล็กน้อยเพื่อคลาสที่มีขนาดใหญ่มากที่มีอยู่ (และคลาสที่มีอยู่สามารถเป็นระดับบนสุดในไฟล์ของตัวเองหรือซ้อนในคลาสระดับบนสุดหรือกำหนดไว้ภายในบล็อกโค้ดเดียว) อินสแตนซ์คลาสใหม่สามารถเข้าถึงข้อมูลทั้งหมดของวัตถุที่สร้างได้อย่างสมบูรณ์ และอินสแตนซ์ใหม่สามารถส่งผ่านและใช้ทั่วโปรแกรมแทนวัตถุที่สร้างขึ้น
(โปรดทราบว่าการใช้การสืบทอดขนาดใหญ่ที่นี่ - เช่นเดียวกับที่อื่นใน Java - นั้นใช้เพื่อวัตถุประสงค์ DRY เท่านั้นมันช่วยให้คลาสที่แตกต่างกันใช้รหัสเดียวกันซ้ำอีกครั้งโปรดสังเกตความง่ายในการสืบทอดใน Java )
นี่ไม่ใช่การอภิปรายที่ครอบคลุม ฉันแค่เกาที่นี่ แต่ใช่มีความแตกต่างที่น่าตกใจในวิธีการใช้การสืบทอดระหว่าง Java และ C # ในแง่นี้ภาษาต่างกันมาก ไม่ใช่จินตนาการของคุณ