Наследяване срещу Композиция
Наследяването и Композицията са две важни концепции, открити в OOP (Обектно ориентирано програмиране). С прости думи, както Композицията, така и Наследяването се занимават с предоставяне на допълнителни свойства или поведение на клас. Наследяването е способността на класа да наследява свойства и поведение от родителски клас, като го разширява. От друга страна, Композицията е способността на класа да съдържа обекти от различни класове като данни за член.
Какво е наследство?
Както бе споменато по-горе, наследяването е способността на класа да наследява свойства и поведение от родителски клас, като го разширява. Наследяването по същество осигурява повторно използване на кода, като позволява разширяване на свойствата и поведението на съществуващ клас от новодефиниран клас. Ако клас A разширява B, тогава клас B се нарича родителски клас (или суперклас), а клас A се нарича дъщерен клас (или производен клас/подклас). В този примерен сценарий клас A ще наследи всички публични и защитени атрибути и методи на суперклас (B). Подкласът може по желание да замени (предостави нова или разширена функционалност на методите) поведението, наследено от родителския клас.
Наследяването представлява връзка „е-а“в ООП. Това по същество означава, че A също е B. С други думи, B може да бъде класът с общо описание на определен обект от реалния свят, но A определя определена специализация. В проблем с програмиране в реалния свят класът Person може да бъде разширен, за да създаде клас Employee. Това се нарича специализация. Но можете също така първо да създадете клас Employee и след това да го генерализирате и в клас Person (т.д. обобщение). В този пример Служителят ще има всички свойства и поведение на Лицето (т.е. Служителят също е Лице) и може също да съдържа някои допълнителни функции (така че Лицето не е Служител).
Какво е композиция?
Композицията е способността на класа да съдържа обекти от различни класове като членски данни. Например клас A може да съдържа обект от клас B като член. Тук всички публични методи (или функции), дефинирани в B, могат да бъдат изпълнени в рамките на клас A. Клас A става контейнер, докато клас B става съдържащ клас. Съставът също се нарича контейнер. В този пример може да се каже, че клас A е съставен от клас B. В OOP Composition представлява връзка „има-а“. Важно е да се отбележи, че въпреки че контейнерът има достъп за изпълнение на всички публични методи на съдържащия се клас, той не може да променя или предоставя допълнителна функционалност. Когато става въпрос за проблем с програмиране в реалния свят, обект от клас TextBox може да се съдържа в класа Form и по този начин може да се каже, че Form съдържа TextBox (или алтернативно, Form е съставен от TextBox).
Каква е разликата между наследяване и композиция?
Въпреки че наследяването и композицията са две ООП концепции, те са доста различни в това, което позволяват на програмиста да постигне. Наследяването е способността на класа да наследява свойства и поведение от родителски клас, като го разширява, докато композицията е способността на класа да съдържа обекти от различни класове като членски данни. Ако даден клас е разширен, той наследява всички публични и защитени свойства/поведение и тези поведения могат да бъдат заменени от подкласа. Но ако един клас се съдържа в друг, контейнерът не получава способността да променя или добавя поведение към съдържащия се. Наследяването представлява връзка „е-а“в ООП, докато композицията представлява връзка „има-а“.