Is-a bir tür ilişkisidir — kalıtım ile modellenir (bir Car bir ). bir ilişkisidir — ile modellenir (bir bir ). Doğru olanı seçmek, temel bir modelleme kararıdır.
Is-a bir tür ilişkisidir — kalıtım ile modellenir (bir Car bir ). bir ilişkisidir — ile modellenir (bir bir ). Doğru olanı seçmek, temel bir modelleme kararıdır.
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
}
Sorun: "X, Y çeşitli midir, yoksa X bir Y sahip mi/kullanır mı?"
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) ✅
İnsanlar kodu yeniden kullanmak için kalıtıma başvururlar; hatta ilişki gerçekten has-a olsa bile. Alt sınıfı her yerde tabana hiç koymayacaksanız, muhtemelen is-a değildir — bileşimi kullanın.
Bu ayrım, "bileşimi kalıtıma tercih et" peri arkasındaki pratik karar kuralıdır: doğru olan ilişkiyi seçin, birkaç satır tasarruf eden değil.
Bunu doğru yapmak hiyerarşileri sığ ve dürüst tutar, ve bir "alt tür" ebeveyn sınıfının yerine hiçbir zaman geçemeyeceği Liskov ihlallerini önler.