การออกแบบ Java: การเพิ่มฟังก์ชันการทำงานทั่วไปให้กับคลาสที่ขยายคลาสพื้นฐานเดียวกัน โดยไม่ต้องแก้ไขคลาสพื้นฐาน

ฉันกำลังพยายามหาวิธีแก้ไขปัญหานี้ให้ดีที่สุดในโครงการที่ฉันกำลังทำอยู่ ฉันจะให้การเปรียบเทียบปัญหา:

มีคลาส รถยนต์ จาก รถยนต์ ฉันสร้าง 3 คลาสที่ขยายมัน:

  • รถลิมูซีน ขยาย รถยนต์
  • รถบรรทุก ขยาย รถยนต์
  • รถบัส ขยาย รถยนต์

ตอนนี้ สมมติว่าฉันรู้ว่ามีคนลืมใส่เมธอด getSpeed() ให้กับคลาส Car และฉันต้องเพิ่มมันเข้าไป แต่ ฉันไม่สามารถแก้ไขคลาส Car ได้เลย และคลาสทั้ง 3 จะต้องขยาย Car ฉันจะเพิ่มฟังก์ชันทั่วไปให้กับคลาสทั้ง 3 เหล่านี้ให้ดีที่สุดโดยไม่ต้องคัดลอกโค้ดวางไปมาได้อย่างไร การใช้งานเมธอด getSpeed() จะเหมือนกันสำหรับแต่ละคลาส ดังนั้นฉันต้องการบางอย่างที่เหมือนกับคลาสนามธรรม แต่ยังคงสามารถเก็บคลาสไว้เป็นการขยาย Car ได้

นี่เป็นตัวอย่างวิธีเดียวของฉันจนถึงตอนนี้ แต่ฉันอยากรู้ว่ามีวิธีที่ดีกว่านี้หรือไม่:

public class Limo extends Car {
    CarSpeed cs;
    public Limo() {
        cs = new CarSpeed(this);
    }
}

และให้คลาส CarSpeed มีเมธอด getSpeed() จริง

มีวิธีที่สะอาดกว่าในการทำเช่นนี้โดยที่ฉันไม่รู้หรือไม่? ฉันยังสามารถทำงานใน Java 7 ได้เท่านั้น ดังนั้นฉันไม่คิดว่าฉันจะสามารถใช้คำหลักเริ่มต้นได้ (ไม่ใช่ว่าฉันได้อ่านมันมากพอที่จะรู้ว่ามันใช้ได้กับสถานการณ์นี้หรือไม่ :( )


person rococo    schedule 16.02.2016    source แหล่งที่มา
comment
ฉันขอถามว่าทำไมคุณไม่สามารถเพิ่ม getSpeed() ลงใน Car ได้ จุดสำคัญของการสืบทอดคือการนำคุณสมบัติบางอย่างของคลาสพาเรนต์/คลาสพื้นฐานมาใช้   -  person ryekayo    schedule 17.02.2016
comment
มันเป็นส่วนหนึ่งของไฟล์ jar ที่ฉันไม่สามารถคอมไพล์ใหม่ได้อย่างสะดวก :(   -  person rococo    schedule 17.02.2016
comment
เย้. อืม.... โดยพื้นฐานแล้วการนำเข้าไลบรารีของคุณถูกต้องแล้วใช่ไหม   -  person ryekayo    schedule 17.02.2016
comment
ใช่ โดยพื้นฐานแล้วฉันสามารถเห็นแหล่งที่มาของ Car ได้ แต่ไม่สามารถใช้เวอร์ชันดัดแปลงได้โดยไม่มีปัญหามากนัก   -  person rococo    schedule 17.02.2016
comment
โอเค ฉันไม่อยากพูดเลย และฉันรู้ว่าคุณไม่ต้องการคัดลอก/วาง แต่การใช้อินเทอร์เฟซอาจไม่ใช่วิธีแก้ปัญหาที่แย่นัก   -  person ryekayo    schedule 17.02.2016


คำตอบ (1)


มีสองวิธีที่เป็นไปได้ในการบรรลุเป้าหมายนี้:

  1. เพิ่ม getSpeed() ให้กับคลาส Car เพื่อให้คลาสอื่นสามารถสืบทอดเมธอดนี้ได้ นี่อาจเป็นวิธีที่ดีที่สุดเนื่องจากเป็นไปตาม OOP

  2. สร้างอินเทอร์เฟซและเพิ่ม getSpeed() เข้าไป สิ่งเดียวก็คือคลาสอื่นๆ เช่น Limo, Truck และ Bus จะต้องสร้างเนื้อหาเป็น getSpeed() เมื่อคุณใช้อินเทอร์เฟซ

person ryekayo    schedule 16.02.2016