Sobes.tech
Junior

Koje su razlike između nasleđivanja i kompozicije u objektno-orijentisanom programiranju?

sobes.tech АИ

Одговор од АИ

Наследство:

  • Веза "је" (is-a).
  • Подкласа наследђује поља и методе класе-родитеља.
  • Користи се за креирање специјализованих верзија постојећих класа.
  • Може довести до ригидних хијерархија и проблема са мултинаследством.

Композиција:

  • Веза "има" (has-a).
  • Класа садржи инстанце других класа као своја поља.
  • Делегира извршавање задатака на садржане објекте.
  • Пружа флексибилност и могућност замене компоненти.

Пример у Јави:

// Наследство
class Vehicle { // Основна класа
    void start() { /* ... */ }
}

class Car extends Vehicle { // Наслеђује од Vehicle
    // Специфичне методе за Car
}

// Композиција
class Engine { // Компонента
    void start() { /* ... */ }
}

class AnotherCar { // Класа која користи композицију
    private Engine engine; // Садржи инстанцу Engine

    AnotherCar(Engine engine) {
        this.engine = engine;
    }

    void start() {
        engine.start(); // Делегирање
    }
}

Разлике се могу представити у виду табеле:

Критеријум Наследство Композиција
Веза "је" (is-a) "има" (has-a)
Јачање Јаче Једноставније
Поновна употреба Преко хијерархија класа Преко објеката
Промена понашања Презапис метода Замена садржаних објеката
Примена Специјализација, проширење функционалности Агрегација, изградња од делова

Генерално, композиција је пожељнија од наследства у већини случајева за постизање већег степена флексибилности и мање зависности између класа.