Różnica między składem a spadkiem

W programowaniu kodem wielokrotnego użytku jest wykorzystanie istniejącego oprogramowania do budowy nowego oprogramowania przy użyciu zasad wielokrotnego użytku. Wielokrotnego użytku kodu uważa się za podstawową funkcjonalność produkcyjną w firmach intensywnie korzystających z technologii informatycznych. Promowany jest w systemach obiektowych poprzez ustanowienie relacji między klasami. Istnieją dwa podstawowe sposoby ustanowienia tych relacji w programowaniu obiektowym - dziedziczenie i kompozycja. Implementacja dziedziczenia jest jednym ze sposobów powiązania klas, ale OOP zapewnia nowy rodzaj relacji między klasami zwany składaniem. Dzięki ustanowieniu relacji między nowymi i istniejącymi klasami nowa klasa może odziedziczyć lub osadzić kod z jednej lub więcej istniejących klas.

W OOP dziedziczenie to metodologia, dzięki której obiekt nabywa cechy jednego lub więcej innych obiektów. Jest to jedno z najpotężniejszych narzędzi do wdrażania wielokrotnego użytku kodu w OOP. Korzystając z dziedziczenia, można utworzyć nową klasę, ustanawiając relacje rodzic-dziecko z istniejącymi klasami. Kompozycja obiektów jest alternatywą dla dziedziczenia klas. Używanie obiektu w innym obiekcie jest znane jako kompozycja. W wielu przypadkach chciałbyś użyć obiektu jako pola w innej klasie, ponieważ łatwo jest tworzyć złożone klasy, używając wcześniej napisanych, dobrze zaprojektowanych klas jako komponentów. To się nazywa kompozycja. Cóż, zarówno dziedziczenie, jak i kompozycja zapewniają w wielu przypadkach równoważną funkcjonalność, kompozycja obiektów jest lepszym modelem ponownego wykorzystania niż dziedziczenie klas. W tym artykule porównano dwa podejścia.

Co to jest dziedziczenie?

Dziedziczenie jest jednym z najpotężniejszych narzędzi do wdrażania ponownego wykorzystania kodu w programowaniu obiektowym. Odnosi się do funkcjonalności, dzięki której jeden obiekt uzyskuje cechy charakterystyczne jednego lub więcej innych obiektów. Dziedziczenie w C ++ oznacza, że ​​możesz tworzyć klasy, które wywodzą swoje atrybuty z istniejących klas. Oznacza to, że specjalizujesz klasę, aby stworzyć relację między klasami, co powoduje silne połączenie klas podstawowych i pochodnych. Wdrożenie dziedziczenia ułatwia ponowne użycie kodu, ponieważ nowe klasy są tworzone z istniejących klas. Dziedziczenie klas ułatwia także modyfikację ponownego wykorzystania implementacji. Ale dziedziczenie klas ma też pewne wady. Po pierwsze, ponieważ dziedziczenie jest definiowane w czasie kompilacji, nie można zmienić implementacji odziedziczonych z klas nadrzędnych w czasie wykonywania.

Co to jest kompozycja?

OOP zapewnia jeszcze inny związek między klasami zwany składem, który jest również znany jako relacja has-a. Jeśli cechy jednego obiektu muszą być częścią innego obiektu, relacja wymaga kompozycji. Aby skomponować klasę z istniejących klas, obiekt każdej klasy powinien zostać zadeklarowany jako członek nowej klasy. Krótko mówiąc, użycie obiektu w innym obiekcie jest znane jako kompozycja. Wiele razy możesz chcieć użyć obiektu jako pola w innej klasie. Używasz obiektu w klasie w składzie. W przeciwieństwie do dziedziczenia klas, skład obiektów jest definiowany dynamicznie w czasie wykonywania przez obiekty, które uzyskują odniesienia do innych obiektów. Ponadto kompozycja zapewnia lepszy sposób korzystania z obiektu bez narażania wewnętrznych szczegółów obiektu, czyli tam, gdzie kompozycja jest użyteczna.

Różnica między kompozycją a spadkiem

Podejście

Chociaż zarówno dziedziczenie, jak i kompozycja promują możliwość ponownego użycia kodu w systemie obiektowym poprzez ustanowienie relacji między klasami i zapewniają równoważną funkcjonalność na wiele sposobów, stosują różne podejścia. Dzięki dziedziczeniu możesz tworzyć klasy, które wywodzą swoje atrybuty z istniejących klas, więc korzystając z dziedziczenia do tworzenia klasy, możesz rozwinąć klasę istniejącą. Przeciwnie, użycie obiektu w innym obiekcie jest znane jako kompozycja. Kompozycja obiektów jest alternatywą dla dziedziczenia klas. Jeśli cechy jednego obiektu muszą być częścią innego obiektu, relacja wymaga kompozycji.

Związek

Dziedzicząc, specjalizujesz klasę, aby utworzyć relację „jest-a” między klasami, co powoduje silne połączenie klas podstawowych i pochodnych. Umożliwia zaprojektowanie hierarchii klas, która rozpoczyna się od najbardziej ogólnej klasy i przechodzi do bardziej szczegółowych klas. Dzięki implementacji dziedziczenia funkcje składowe z jednej klasy stają się właściwościami innej klasy bez kodowania ich wprost w klasie. W składzie używasz obiektu wewnątrz klasy, a wszelkie żądania do obiektu są przekazywane do obiektu. Wewnętrzne szczegóły nie są narażone na siebie w składzie, więc jest to relacja „ma”.

Realizacja

Dziedziczenie klas jest definiowane w czasie kompilacji, więc nie można zmieniać implementacji odziedziczonych z klas nadrzędnych w czasie wykonywania. Ponieważ dziedziczenie naraża podklasę na szczegóły implementacji jej rodzica, często przerywa enkapsulację. Wszelkie zmiany w klasie nadrzędnej zostaną odzwierciedlone w podklasie, co może powodować problemy podczas próby ponownego użycia podklasy. Wręcz przeciwnie, skład obiektów jest definiowany dynamicznie w czasie wykonywania poprzez obiekty, które uzyskują odniesienia do innych obiektów. A ponieważ do obiektów można uzyskać dostęp wyłącznie poprzez ich interfejsy, nie spowoduje to przerwania enkapsulacji. Dowolny obiekt może zostać zastąpiony w czasie wykonywania innym obiektem, o ile ma ten sam typ.

Kompozycja a dziedziczenie: tabela porównawcza

Podsumowanie składu a dziedziczenie

W wielu przypadkach można użyć obiektu jako pola w innej klasie, ponieważ tworzenie klas złożonych jest łatwiejsze przy użyciu wcześniej napisanych, dobrze zaprojektowanych klas. Tutaj używasz kompozycji. Dziedziczenie zapewnia sposób na ponowne użycie kodu poprzez rozszerzenie klasy przy minimalnym wysiłku, dlatego dziedziczenie jest cennym narzędziem w nawiązywaniu relacji między klasami. Zasadniczo zaleca się stosowanie kompozycji, ponieważ zapewnia ona sposób korzystania z obiektu bez narażania wewnętrznych szczegółów obiektu, w którym kompozycja jest użyteczna. Dziedziczenie nie jest bezproblemowe, ale podobnie jak dziedziczenie, skład obiektów budzi podobne obawy dotyczące wydajności w odniesieniu do tworzenia i niszczenia obiektów.