është një marrëdhënie e — modeluar me (një ). është një marrëdhënie e — modeluar me (një ). Zgjedhja e duhur është një vendim themelor modelimi.
është një marrëdhënie e — modeluar me (një ). është një marrëdhënie e — modeluar me (një ). Zgjedhja e duhur është një vendim themelor modelimi.
CarVehicleCarEngine// 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
}
Pyesni: "A është X një lloj Y, apo X ka/përdor një 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) ✅
Njerëzit përdorin trashëgimin për të ripërdorur kodin, edhe kur marrëdhënia është me të vërtetë has-a. Nëse nuk do ta zëvendësonit kurrë nënklasën për klasën bazë kudo, atëherë ndoshta nuk është is-a — përdorni përbërjen.
Ky dallim është rregulla praktike përhapur pas "favorizoni përbërjen mbi trashëgimet": zgjidhni marrëdhënien që është e vërtetë, jo atë që kursen disa rreshta.
Zgjidhja e saktë e mban hierarkinë të cekët dhe të sinqertë, dhe parandalon shkeljet Liskov ku një "nënlloj" nuk mund të qëndrojë në vend të klases së saj mëmë.