Композиція 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
Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.