@cybernoob

Почему нельзя наследоваться от класса БД?

Представим себе что у нас есть класс DB, который работает с базой данных. Он имеет простые и понятные методы CRUD.
Почему бы от него не унаследовать остальные классы? Например класс юзеров или класс статей.
Это же очень удобно, я просто могу сделать parent::saveUser();

Можете объяснить почему это плохая практика (только не так что "это нарушает принцип единственной обязанности" - это я и сам знаю).

И как правильно определить какой клас можно от какого наследовать, и по каким признакам можно определить что нельзя и это плохая идея?
  • Вопрос задан
  • 213 просмотров
Решения вопроса 5
qonand
@qonand
Software Engineer
Уж извините, никого не хочу обидеть, но подобное желание наследоваться от всего подряд и отсутствие понимая почему так нельзя делать говорит о полном не понимании концепции ООП. Полноценно ответить на Ваши вопросы не возможно - не хватит поста, тут целую лекцию можно написать. Да и ответы породят только дополнительные вопросы. Поэтому лучше уделите недельку другую - и прочтите пару книг по ООП, и сразу все станет на свои места..
Ответ написан
Комментировать
gobananas
@gobananas
finishhim.ru
В этом случае можно применить dependency injection, что бы передать объект базы в нужный класс. Наследоваться стоит когда сущности с которыми работают родитель и наследник одинаковые.
Ответ написан
Комментировать
И как правильно определить какой клас можно от какого наследовать, и по каким признакам можно определить что нельзя и это плохая идея?

мне на эту тему понравилась глава 32 из книги Скотта Майерса "Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ", можете погуглить.

глава называется "Используйте открытое наследование для моделирования отношения «является»"
и общая суть там ворочается вокруг
"Если вы пишете класс D (derived – «производный») открыто наследует классу B («base» – «базовый»), то тем самым сообщаете компилятору C++ (а заодно и людям, читающим ваш код), что каждый объект типа D является также объектом типа B, но не наоборот. Вы говорите, что B представляет собой более общую концепцию, чем D, а D – более конкретную концепцию, чем B. Вы утверждаете, что везде, где может быть использован объект B, можно использовать также объект D, потому что D является объектом типа B. С другой стороны, если вам нужен объект типа D, то объект B не подойдет, поскольку каждый D «является разновидностью» B, но не наоборот."(с)

В вашем же случае наследование юзера от DB можно интерпретировать как "пользователь является базой данных" - чувствуете что здесь что-то не то?
Ответ написан
Комментировать
@synapse_people
посмотрите шаблон репозитория, в вашем случае подходит..
Сегодня-завтра вдруг появится необходимость поменять способ хранения и что...?
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
Потому что нельзя наследовать человека от стула лишь потому что там есть спинка и ножки
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы