Композиція vs Наслідування
Недавно доводилось працювати з людьми які на дух не переносять наслідування. Всюди де можна і не можна використовували композицію.
Щоб зберегти тверезість розуму вирішив спробувати перелічити коли і що треба використовувати.
Наслідування
1) коли є is-a залежність
2) коли is-a є постійною в часі, тобто стан об'єкту моделюється не класами, а властивостями класу
Композиція
1) коли можливо has-a pалежність
2) коли потрібно перевикористати код
3) коли необхідно поліморфізм, але немає is-a зв'язку — краще використати інтерфейси
4) коли супер клас є недоступним до модифікації (чи може краще зразу адаптер?)
Щодо базових класів — то їх краще зразу оголошувати як abstract щоб потім не було мороки, коли коду багато.
Якісь ще є думки на цю тему?
- +4
- 22 липня 2009, 16:58
- zenyk
Коментарі (10)
RSS згорнути / розгорнутиАле я довго думав про те, що буде краще: зразу чи відразу (чи одразу), але не знаю.
mamantoha
композиція (composition) це:
zenyk
cyba
агрегація та композиція це підтипи асоціації.
різниця між композицією та асоціацією полягає у тому, що об'єкти у першому є частиною класу і також мають такий самий життєвий цикл. тобто коли знищується клас, при композиції, також знищуються його елементи. в той час при агрегації, об'єкти можуть існувати незалежно один від одного.
приклад композиції: будинок та квартири (щось типу owns)
приклад агрегації: будинок та мешканці
в першому випадку квартири не можуть існувати без будинку, в другому випадку мешканці можуть існувати без будинку.
але і перше і друге це асоціація
zenyk
cyba
коли is-a показує стан, наприклад людина може бути у стані: підліток, дорослий та похилогоВіку, тоді краще це робити не класами:
:)
zenyk
cyba
тобто можна сказати що Підліток це стан Людини. Хоча в певний момент Підліток is-a Людина, в часі це не завжди так. тому з точки зору реалізації (а не дизайну) доцільніше це показати як стан класу, а не як окремий клас.
zenyk
а точто private? классы будут несколько не равнозначные.
savostin
це дуже узагальнено, в принципі може бути і не private i.e. public, але тоді це точно не композиція так як можна отримати посилання на A, яке буде жити після смерті екземпляра B.
zenyk
Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.