จะดำเนินการและขยายเวลาเมื่อใด [ปิด]


91
  • เมื่อควรimplementหรือextendจะใช้งานอย่างไร
  • มีตัวอย่างอะไรบ้างในโลกแห่งความเป็นจริง

ถูกต้องหรือไม่

การใช้งานดูเหมือนจะเป็นวิธีบังคับใช้ว่าเมธอดบางอย่างมีอยู่ในคลาสและการเรียกฟังก์ชันเมธอดเหล่านี้ได้รับการจัดรูปแบบอย่างถูกต้อง การนำไปใช้ไม่ใช่วิธีการส่งผ่านตัวแปรหรือ "การตั้งค่า" ไปยังชั้นเรียน?

สถานการณ์ในชีวิตจริงที่คาดไว้:ฉันมีแพลตฟอร์มอีคอมเมิร์ซที่มีคลาสการชำระเงินหลายแบบซึ่งทั้งหมดเป็นไปตามรูปแบบเดียวกัน เมื่อควรเพิ่มคลาสการชำระเงินใหม่มันง่ายมากที่จะทำตามการออกแบบที่กำหนดไว้interfaceเพื่อให้แน่ใจว่าบิตและชิ้นส่วนทั้งหมดอยู่ที่นั่นตั้งแต่เริ่มต้น

การขยายคลาสทำให้คลาสที่ขยาย (ลูก?) สืบทอดทุกอย่างจากคลาสแม่ยกเว้นวิธีการและตัวแปรที่ประกาศเป็นprivate?

สถานการณ์ในชีวิตจริงที่คาดว่าจะฉันได้ระดับหนึ่งเรียกว่าsessionsมีสองชั้นเรียนของเด็กชื่อและsessioncookies และdatabasesessionssessioncookiesdatabasesessionsร่วมกันสืบทอดตัวเลือกการกำหนดค่าร่วมกันจำนวนมากจากเซสชันหลักของพวกเขาทำให้ง่ายต่อการเปลี่ยนตัวเลือกการกำหนดค่าเพื่อส่งผลต่อการจัดเก็บข้อมูลผู้เยี่ยมชมในที่สุดทุกประเภท


1
ฉันขอแนะนำให้คุณอ่านข้อมูลเกี่ยวกับมรดก
Rafe Kettler

คำตอบ:


64

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

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

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

การสืบทอดเป็นแนวคิดที่ยิ่งใหญ่ใน OOP ที่นอกเหนือไปจาก PHP ผมขอแนะนำให้คุณอ่านบทความวิกิพีเดียในการรับมรดกและบางทีอาจจะรูปแบบการออกแบบโดยแก๊งสี่

ฉันเชื่อว่าความเข้าใจของคุณเกี่ยวกับการถ่ายทอดทางพันธุกรรมนั้นถูกต้องเป็นหลัก ขั้นตอนต่อไปคือการนำไปใช้ในการผลิต


4
หลายคนมองว่าหนังสือ The Gang of Four มีน้ำหนักมากเกินไปในแง่ของวัสดุเพื่อเป็นการแนะนำรูปแบบการออกแบบ ทางเลือกที่เป็นที่นิยมคือ Head First: รูปแบบการออกแบบซึ่งทำให้การอ่านเบาลง amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"ระวังกรณีที่คุณกำหนดวิธีการเดียวกันในหลายคลาสซึ่งเป็นกรณีที่ยอดเยี่ยมที่คุณสามารถแยกวิธีการเหล่านั้นออกเป็นคลาสพื้นฐานได้" การขยายคลาสจะมีประโยชน์มากกว่าการใช้ลักษณะเพื่อกำหนดวิธีการเหล่านั้นหรือไม่?
Daniel Weiner

1
"การสืบทอดมีประโยชน์ในการลดจำนวนโค้ดที่คุณเขียนใหม่" - วัตถุประสงค์ของการสืบทอดคือการแบ่งปันพฤติกรรมไม่ใช่โค้ด ในกรณีที่เป็นไปได้ลักษณะเป็นวิธีการแบ่งปันโค้ดแทนที่จะขยายคลาสนามธรรมด้วยคลาสที่เป็นรูปธรรมซึ่งไม่มีอะไรเหมือนกัน โดยปกติคุณสามารถจำลองคลาสของคุณเป็น has-a แทนที่จะเป็น is-a
ดันแคน

14

ดำเนินการ:

อินเทอร์เฟซเป็นคลาสนามธรรมดังนั้นคุณสามารถประกาศได้เฉพาะสิ่งต่างๆ คลาสใช้อินเทอร์เฟซ คุณสามารถใช้หลาย ๆอินเทอร์เฟซ

ขยาย:

คุณ ขยายชั้นเรียนเมื่อคุณต้องการเวอร์ชันที่เฉพาะเจาะจงมากขึ้นของชั้น

ตัวอย่าง:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

ทั้งอูฐและสุนัขเป็นสัตว์ดังนั้นพวกเขาจึงขยายAnimalชั้นเรียน แต่มีเพียงสุนัขเป็นชนิดที่เฉพาะเจาะจงของAnimalที่ยังสามารถเป็นPet

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