ฉันเชื่อว่าคนส่วนใหญ่คุ้นเคยกับสองสิ่งของ "มรดก" และ "การรวมกัน" ในชวา บทความนี้ส่วนใหญ่จะหารือเกี่ยวกับสองหัวข้อนี้ ถ้าฉันเขียนอะไรผิดพลาดหรือเป็นเด็กและการโต้แย้งไม่ชัดเจนทุกคนยินดีที่จะฝากข้อความเพื่อแก้ไขฉัน
สมมติว่ามี 2 คลาส: A และ B :
extends B จากนั้นเราบอกว่า A สืบทอด B, A คือ subclass และ B เป็นคลาสหลักและกรณีนี้เป็นมรดกลองนึกย้อนกลับไปถึงสถานการณ์ใดที่เรามักจะพิจารณาสองสิ่งนี้? ฉันคิดถึงมันสั้น ๆ และมักจะมีสถานการณ์ต่อไปนี้:
abstract class หรือ interface จะถูกสกัด หลังจากคิดถึงมันดูเหมือนว่ามีเพียงสองสถานการณ์นี้จริงๆ แต่สถานการณ์ทั้งสองนี้มีความสัมพันธ์พิเศษ ตัวอย่างเช่น รหัสสาธารณะ สามารถทำได้ abstract class และ interface (วิธีเริ่มต้นใน Java 8)
หลังจากพูดเรื่องไร้สาระมากฉันจะโยนมุมมองของฉัน ยินดีต้อนรับสู่:
abstract class หรือ interface ตัวอย่างที่พบบ่อย: ในโครงการจริงเรามักจะกำหนด POJO หรือ model และโมเดลเหล่านี้มักจะมีคุณลักษณะบางอย่างที่มีคำนามและประเภทเดียวกันเช่น:
// db table primary keyprivate int id; เป็นเรื่องธรรมดามาก แต่ฉันได้พบกับเพื่อนร่วมงานหลายคนในงานจริงของฉัน ระบบกำหนดคลาสที่มีชื่อ BaseModel หรือ RootModel วาง id แอตทริบิวต์ข้างต้นไว้ในนั้นและจากนั้นทุกรุ่นในโครงการทั้งหมดสืบทอดคลาส basemoddel นี้ ฉันสงสัยว่าคุณเคยพบเพื่อนร่วมงานดังกล่าวหรือไม่? ประโยชน์และข้อเสียของการเขียนเช่นนี้คืออะไร?
มาพูดถึงผลประโยชน์ก่อน หากคุณต้องบอกว่ามีประโยชน์อะไรบ้างคุณจะไม่เห็นผลประโยชน์ มากมาย ยกเว้นการพิมพ์แป้นพิมพ์สองสามครั้งและขาดคุณสมบัติเหล่านี้ในคลาสย่อย อย่างไรก็ตามมันได้ก่อให้เกิดสิ่งที่ลำบากมากในการบำรุงรักษาโครงการที่ตามมา
จากนั้นมาพูดคุยเกี่ยวกับปัญหาที่อาจเกิดขึ้นของการเขียนนี้:
วันหนึ่งด้วยเหตุผลบางอย่างคุณต้องการค้นหาว่าจะใช้
idแอตทริบิวต์ในคลาสย่อย A (สืบทอด basemodel) ในโครงการ
คุณเป็นคนฉลาดและใช้งานอย่างชำนาญ find usages ใน IDE และจากนั้นคุณจะพบว่าคุณพบสถานที่ใช้งานจำนวนมากและหลายแห่งไม่ใช่สิ่งที่คุณสนใจเลย แต่ไม่มีทางคุณได้ค้นหาตำแหน่งการใช้งานของรหัสคุณสมบัติของคลาสอื่น ๆ ที่สืบทอด basemodel หากโครงการไม่ใหญ่คุณอาจมีความเชี่ยวชาญน้อยลง เกิดอะไรขึ้นถ้าโครงการใหญ่ขึ้นเล็กน้อย? เมื่อคุณมีความสามารถมากกว่า 50 ในการค้นหาคุณจะทำอะไรต่อไป?
จะหลีกเลี่ยงสถานการณ์นี้ได้อย่างไร? นั่นคืออย่าใช้ BaseModel เช่นนี้เพื่อใช้การสืบทอดแอตทริบิวต์ แน่นอนว่าเพื่อประโยชน์ของช่วงเวลาที่เข้มงวดฉันยังต้องอธิบายความหมายนี้ในรายละเอียด ฉันไม่ได้คัดค้านการสืบทอดแอตทริบิวต์อย่างสมบูรณ์ ขอชี้แจงกันเถอะ:
สิ่งที่ฉันคัดค้านคือทุกรุ่นของโครงการทั้งหมดสืบทอด basemodel แล้วใส่คุณสมบัติทั่วไปใน basemodel
แนวคิดนี้คือการทราบว่าเป็นโครงการทั้งหมด
โดยส่วนตัวแล้วฉันมักจะพบตัวอย่างของตำราเชิงลบด้านบนดังนั้นฉันจะพูดถึงพวกเขาแยกกัน ฉันไม่แน่ใจว่าสิ่งนี้เกิดขึ้นในโครงการของคุณหรือไม่ อย่างไรก็ตามฉันได้รับการโกงโดยเพื่อนร่วมงานหลายครั้ง
สำหรับข้อผิดพลาดทั่วไปอื่น ๆ ที่เกี่ยวข้องกับ "การรวมกัน" และ "มรดก" ฉันยังไม่ได้คิดถึงมัน (อย่างน้อยฉันคิดว่าไม่มีใครทำ) ถ้าฉันคิดว่ามันชัดเจนในอนาคตหรือหากผู้อ่านมีคำแนะนำอื่น ๆ ฉันหวังว่าคุณจะฝากข้อความไว้เพื่อสื่อสาร