О основных понятиях вопросов нет, всем понятно, что это Наследование, полиморфизм и инкапсуляция, но вороша просторы гугла я понял что ничего не понял. Есть еще какие то композиция, и ассоциация. Причем что на разных сайтах пишут по разному, где то 3 основных это наследование, композиция и агрегация, а где то вообще какая то Абстракция. Подскажите пожалуйста в чём правда кроется, просто чем глубже я рыл, тем сильнее не понимал. Заранее спасибо за ответ)
Нет смысла обсуждать ООП без языка разработки. Просто специфика языка, который ты выберешь будет такова, что под нее придется подгонять твою теорию. Увы увы.
Агрегация/Ассоциация/Композиция - это всё виды взаимоотношений между разными типами. Это не принципы
Абстракция - это просто сама возможность вводить какие-то новые абстракции, поверх уже существующих. Ради этого ООП и придумано.
ИМХО, вот эти все попытки выделить основные принципы ООП в современном мире не имеют смысла, тк языки сейчас мультипарадигменные и постоянно добавляют и убирают какие-то части.
И уже споров о глубинном смысле трёх волшебных слов была целая куча (а ведь если бы кто-то когда-то не решил всё уместить в одиночные слова - этой неразберихи бы не было)
Так что из всех принципов, которые объединяют все более-менее ООП-языки остаётся только:
1. Всё есть объект, и объект объединяет под собой некоторые данные (которые могут быть не доступны публично) и операции (методы или функции), которые можно произвести над совокупностью этих данных.
2. Имеется какой-нибудь механизм для полиморфизма.
В общем-то первый такой принцип можно назвать этой самой абстракцией и, отчасти, инкапсуляцией.
Инкапсуляция - это самое простое. В объекте лежат данные и методы для работы с ними (причём данными могут быть и другие объекты. см. Композиция). Самое главное в инкапсуляции - не переборщить. Инкапсулировать только то, что относится одной конкретной задаче. Всё остальное делегировать другим объектам (см. Композиция).
Наследование - это тоже самое простое и самое опасное. Захотел добавить новый функционал к уже существующему классу - унаследовался, дописал методик - и в путь! А потом исходный класс поменяли, и он стал ломать поведение унаследованного. Лучше всего взять себе за правило наследоваться только от абстрактных классов. А поведение менять с помощью свойств-объектов других классов (см. Композиция).
Полиморфизм. Один метод - поведение разное. Проще всего достигается за счёт использования свойств-объектов других классов (см. Композиция).
Композиция - это самое интересное. Объект действует не сам по себе, а с помощью свойств-объектов, которые передаются в конструктор при создании объекта. Например, у нас есть класс Модели, который должен уметь делать КРУД. А точнее сам по себе он содержит только данные, а в качестве зависимости в него передаётся объект для работы с БД, имеющий собственно эти самые методы create(), read(), update() и delete(). И вот этот объект может быть как инстансом класса, работающего, например, с Mysql, а может быть - работающего с Редисом. И теперь, в зависимости от наших потребностей, одна и та же модель может сохраняться как в Редис, так и в РСУБД. Без изменения и единственной строчки кода!
Если коснулись композиции - то уже можно перечислять не свойства ООП а шаблоны которые порождены ООП-мыслью. Сколько их там? Дай бох памяти. Когда я читал банду четырех было около 30. Щас уже - больше создано.