Is-a คือความสัมพันธ์ของ ประเภท — จำลองโดย สืบทอด (Car ). คือความสัมพันธ์ของ — จำลองโดย ( ). การเลือกสิ่งที่ถูกต้องคือการตัดสินใจการจำลองที่สำคัญ
Is-a คือความสัมพันธ์ของ ประเภท — จำลองโดย สืบทอด (Car ). คือความสัมพันธ์ของ — จำลองโดย ( ). การเลือกสิ่งที่ถูกต้องคือการตัดสินใจการจำลองที่สำคัญ
VehicleCarEngine// IS-A → inheritance
class Vehicle { void move() {} }
class Car extends Vehicle { } // a Car IS A Vehicle
// HAS-A → composition
class Engine { void start() {} }
class Car2 {
private Engine engine = new Engine(); // a Car HAS AN Engine
void start() { engine.start(); } // delegate to the part
}
ถาม: "X เป็นประเภท Y หรือ X มี/ใช้ Y?"
A Dog IS-A Animal → inheritance ✅
A Car HAS-A Engine → composition ✅
A Square IS-A Shape → inheritance ✅
A Manager HAS Employees → composition (a list) ✅
A Stack HAS-A list (not IS-A) → composition (see earlier pitfall) ✅
คนมักหันไปใช้สืบทอดเพื่อ นำโค้ดกลับมาใช้ แม้ว่าความสัมพันธ์นั้นจริง ๆ แล้ว has-a ก็ตาม หากคุณไม่เคยแทนที่คลาสย่อยด้วยคลาสฐานทุกแห่ง อาจไม่ใช่ is-a — ให้ใช้การประกอบ
ความแตกต่างนี้คือกฎการตัดสินใจในทางปฏิบัติเบื้องหลัง "ชอบการประกอบมากกว่าการสืบทอด": เลือกความสัมพันธ์ที่เป็นจริง ไม่ใช่สิ่งที่ช่วยเหลือบางบรรทัด
การทำให้ถูกต้องจะรักษาลำดับชั้นให้ตื้นและซื่อสัตย์ และป้องกันการละเมิด Liskov ที่ "ประเภทย่อย" ไม่สามารถยืนแทนคลาสแม่ได้