Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование.
Ответ, что для расширения и переопределения функционала базовых классов их не устроил. В пример начинаю приводить декоратор, C# extension methods и .т. д.
Что-то я не могу даже нагуглить какой ответ там ожидался.
Я бы ответил, что для прокидывания интерфейса. Например, COM. Ты не знаешь что внутри, но знаешь что поддерживает тот или иной интерфейс и уже можешь работать с этим.
Здравствуйте, Amon_RA, Вы писали:
A_R>Здравствуйте, BlackEric, Вы писали:
A_R>Я бы ответил, что для прокидывания интерфейса. Например, COM. Ты не знаешь что внутри, но знаешь что поддерживает тот или иной интерфейс и уже можешь работать с этим.
Не уверен. В C++ интерфейсов нет, а наследование есть.
Здравствуйте, BlackEric, Вы писали:
BE>Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование. BE>Ответ, что для расширения и переопределения функционала базовых классов их не устроил. В пример начинаю приводить декоратор, C# extension methods и .т. д.
LSP — входит в пять принципов ООП — SOLID.
BE>Что-то я не могу даже нагуглить какой ответ там ожидался.
Вот и выросло поколение ЕГЭ, избегающее думать и задумываться.
Здравствуйте, iZEN, Вы писали:
ZEN>Здравствуйте, BlackEric, Вы писали:
BE>>Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование. BE>>Ответ, что для расширения и переопределения функционала базовых классов их не устроил. В пример начинаю приводить декоратор, C# extension methods и .т. д.
ZEN>https://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков ZEN>- входит в пять принципов ООП — SOLID.
А можно подробнее, что я не понял связь принципа подстановки и наследования.
я не заморачиваюсь и просто спрашиваю, что ожидалось услышать
правда, я и хожу, последнее время, джаст фо фан
*в большинстве случаев, долго ржу (не вслух)
про солид итд спрашивают обычно в контексте про ооп, оод, паттерны проектирования итд
хотя можно было бы ответить тип — наследование нужно для уменьшения избыточности
но это все разный угол на одну и туже точку, что ожидал в ответ собеседующий никто не узнает
1) для DRY ("Каждая часть знания должна иметь единственное, непротиворечивое и авторитетное представление в рамках системы") — общий для разных наследников код реализуется в их предке, заодно и общие поля данных в нём описываются (обычно когда все классы пишет один программист)
2) (то что вы собственно ответили) для удобства расширения по принципу открытости/закрытости — O в SOLID (обычно когда наследников пишет уже другой программист)
Здравствуйте, iZEN, Вы писали:
BE>>Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование. BE>>Ответ, что для расширения и переопределения функционала базовых классов их не устроил. В пример начинаю приводить декоратор, C# extension methods и .т. д.
ZEN>LSP — входит в пять принципов ООП — SOLID.
Это не причина использования наследования, а ограничение на это использование.
BE>>Что-то я не могу даже нагуглить какой ответ там ожидался.
ZEN>Вот и выросло поколение ЕГЭ, избегающее думать и задумываться.
А какое поколение отличается неумением читать вопрос и ответами на то, что не спрашивалось?
The God is real, unless declared integer.
Re: Перед этим спрашивали "Что такое наследование?"?
Перед тем как задать вопрос "Зачем нужно наследование?", спрашивали "Что такое наследование?" ?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
BE>Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование.
Это один из приёмов повторного использования кода. BE>Ответ, что для расширения и переопределения функционала базовых классов их не устроил. В пример начинаю приводить декоратор, C# extension methods и .т. д.
Приёмов повторного использованя кода много, сравнительная эффективность сильно зависит от исполнителя, у каждого может оказаться свой любимый инструментарий. BE>Что-то я не могу даже нагуглить какой ответ там ожидался.
Нужно угадать и спеть почитаемые именно этими собоседователями мантры и паттерны.
Здравствуйте, BlackEric, Вы писали:
A_R>>Я бы ответил, что для прокидывания интерфейса. Например, COM. Ты не знаешь что внутри, но знаешь что поддерживает тот или иной интерфейс и уже можешь работать с этим. BE>Не уверен. В C++ интерфейсов нет, а наследование есть.
Если следовать классике жанра C++, то считается, что интерфейс в нём это:
1. Открытые члены класса
2. Шаблон проектирования
И то и другое в C++ легко реализуемо и по сути является базовыми понятиями. Нет лишь специального ключевого слова, как в некоторых других известных языках программирования. Хотя если брать более продвинутые реализации такие как Qt, стоит отметить, что там интерфейсы ушли далеко вперёд, в частности это хорошо видно в плагиностроении.
Здравствуйте, Amon_RA, Вы писали:
A_R>Я бы ответил, что для прокидывания интерфейса. Например, COM. Ты не знаешь что внутри, но знаешь что поддерживает тот или иной интерфейс и уже можешь работать с этим.
Это уже не просто наследование, а больше полиморфизм. Но раз уж они были упомянуты, то можно ещё спросить и про инкапсуляцию. Хотя с другой стороны зачем спрашивать. Может всё это повод задуматься, может быть наследование и не нужно вовсе и эффективнее использовать агрегирование, а то и вовсе переходить на другую парадигму программирования, то есть не ООП. По большому счёту наследование это понятие из материальной логики, именно оттуда программисты и взяли это и многое другое.
Здравствуйте, BlackEric, Вы писали:
BE>Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование.
Чтобы скрытно увеличить связность и добавить неочевидные взаимодействия. Украсить случайными перекрытиями функций базового класса.
На самом деле наследование используется для двух вещей: наследование интерфейса (и тут LSP рулит, потому что такое наследование говорит, что производный класс является и базовым тоже). Компилятор поддерживает неявное приведение производного типа к базовому.
для более базового принципа — повторного использования кода (а также закрытости к изменению и открытости к расширению). Тут используется приватное наследование (которое в том числе запрещает неявное приведение производного класса к базовому). В этом случае LSP не работает (хотя используется все то же наследование, но любители LSP такой вариант вообще не понимают, поэтому хором рассказывают сказки, что это что-то "странное" и "так делать не надо", хотя нет никаких причин не использовать инструмент там, где он подходит). Это как раз тот случай, когда квадрат можно унаследовать от прямоугольника (если наследование от Shape не требуется). Часто заменяется инкапсуляцией, потому что так понятнее.
P.S. Это все было про C++ (хотя это базовые принципы ООП, которые универсальные).
BE>Хожу я тут по собеседованиям. И вот уже дважды меня спросили зачем нужно наследование. BE>Ответ, что для расширения и переопределения функционала базовых классов их не устроил. В пример начинаю приводить декоратор, C# extension methods и .т. д.
BE>Что-то я не могу даже нагуглить какой ответ там ожидался.
У меня завтра как раз собеседование, вот и спрошу кандидата
Здравствуйте, Qt-Coder, Вы писали:
QC>Здравствуйте, BlackEric, Вы писали:
BE>>Что-то я не могу даже нагуглить какой ответ там ожидался. QC>Для уменьшения копи-паста.
Плохо продуманное наследование только увеличивает количество копипасты. "А если хочется переопределить поведение наследника, надо взять 99% кода из метода предка и вклинить свой 1% там где нужно"
Собственно, паттерны от GoF/Fowler/etc как раз об этом: набор типичный сценариев, которые появляются при вычленении сущностей, и как не накосячить с этим в своём коде.