При попытке объяснить концепцию наследования в ООП, типичным примером часто является пример млекопитающих. ИМХО, это действительно плохой пример, потому что это заставит новичков неправильно использовать эту концепцию. Более того, это не обычный дизайн, с которым они столкнутся в своей повседневной работе.
Итак, что будет хорошей, простой и конкретной проблемой, которая решается с помощью Inheritance?
design-patterns
object-oriented
inheritance
Пьер Ватле
источник
источник
Ответы:
Нет ничего плохого в чисто академическом примере, подобном млекопитающим. Мне также нравится пример прямоугольника / квадрата, потому что он указывает, почему реальные таксономии не всегда напрямую переводятся в ожидаемые отношения наследования.
На мой взгляд, наиболее каноническим примером на каждый день является GUI инструментарий. Это то, что все использовали, но новички, возможно, не рассуждали о том, как они работают под капотом. Вы можете говорить о том, какое поведение является общим для всех контейнеров, всех виджетов, событий и т. Д., Не требуя детального знания какой-либо конкретной реализации.
источник
Мой реальный пример - доменная модель простого HR-приложения. Я говорю, что мы можем создать базовый класс с именем Employee , потому что, конечно, менеджеры тоже являются сотрудниками.
Затем я объясняю, что разработчики - это сотрудники , тестеры - это сотрудники , руководители проектов - сотрудники . Таким образом, они все могут наследовать от класса работников.
источник
Employee
иabstract
класс тоже может быть .Developer
и aTester
. Другая похожая ситуация - это база данных контактов, где у вас естьCustomer
иSupplier
, но, как скажет вам любой, кто создал такую систему, всегда есть случай, когда aCompany
- это то и другое. Вот почему большинство этих примеров ведут вас в неправильном направлении.Инкапсулируйте то, что меняется ... покажите им шаблон шаблонного метода , он демонстрирует полезность наследования, помещая общее поведение в базовый класс и инкапсулируя различное поведение в подклассы.
UI controls
иStreams
также являются очень хорошим примером полезности наследования.источник
Помнить
Каждый экземпляр объекта является конкретным примером полезности наследования!
Если вы имеете в виду именно наследование классов , то теперь вы находитесь в мире таксономий, и они будут сильно различаться в зависимости от целей системы, которая их использует. В примере с животными / млекопитающими используется общая и, как мы надеемся, знакомая таксономия из биологии, но она (как вы упомянули) почти бесполезна для подавляющего большинства задач программирования.
Так что попробуйте что-нибудь универсальное: понятие программы. Каждая программа запускается, запускается и заканчивается. У каждой программы есть имя и необязательные параметры командной строки. Таким образом, базовый класс Program был бы очень полезен для запуска выполнения, сбора и обработки аргументов командной строки, запуска основной логики и корректного завершения работы.
Вот почему так много объектно-ориентированных языков программирования предоставляют класс Program или что-то, что ведет себя точно так же, как класс Program.
источник
class Programm { public static void main(String[] args) { system.out.println('hello world'); }}
минимальная Java-программа Когда я звоню, нет экземпляра Программы. Программа не наследует ни от чего. Когда я запускаю 3 процесса (как вы делаете с crhome), может быть 3 программы, но в их отдельных областях памяти остается только одна программа. Имхо, синглтон подразумевает «только один экземпляр на процесс», а не на машину. Если это так, было бы невозможно создавать синглтоны, ничто не мешает вам выполнить любой код дважды.Я работаю с камерами на работе. У нас есть устройства, которые подключаются к разным моделям, поэтому у нас есть абстрактный «класс камеры», и каждая модель наследуется от этого класса для поддержки определенных функций этой камеры. Это пример из реального мира, и его нетрудно понять.
источник
Camera
и aPhone
(как мы сейчас делаем в наших карманах). От какого базового класса он должен наследоваться? Или она не должна просто реализовать обаICamera
иIPhone
интерфейсы? (ха-ха)Пример Химических Элементов
Это еще один пример из моего мозга:
источник
isotope
не частный случайElemenet
. Я предпочел бы иметьElement
собственность наIsotope
.Реальные примеры почти всегда ошибаются, потому что они приводят примеры, где всегда есть вероятность того, что что-то есть
TypeA
и то, и другое,TypeB
но иерархия единого наследования во многих языках не позволяет этого.Чем больше я программирую, тем больше ухожу от наследства.
Даже слово «наследовать» здесь используется неправильно. Например, вы наследуете около 50% черт вашего отца и 50% черт вашей матери. На самом деле ваша ДНК - это составная часть половины ДНК вашего отца и половины ДНК вашей матери. Это потому, что биология на самом деле предпочитает композицию наследованию , и вы тоже должны.
Простая реализация интерфейсов, или, что еще лучше, «типизирование утки», плюс внедрение зависимостей, - гораздо лучшая вещь для обучения людей, плохо знакомых с объектно-ориентированным программированием.
источник
Я бы просто показал им пример из жизни. Например, в большинстве сред пользовательского интерфейса вы создаете свой собственный класс "Dialog", "Window" или "Control".
источник
Хорошим примером является функция сравнения в сортировке:
Единственная проблема в том, что новички слишком часто думают, что производительность важнее хорошего кода ...
источник
Мой пример из реального мира - это транспортное средство:
Этот пример может быть настолько подробным, насколько вам угодно, и к транспортным средствам прикреплены всевозможные свойства, объясняющие использование любых модификаторов, которым вы, возможно, захотите научить.
источник
Этот пример не-млекопитающих, не-птиц, не-рыб может помочь:
потом
ПРИМЕЧАНИЕ: только не говорите секрет: человек расширяет Млекопитающее.
источник
Как насчет иерархии алгебраических выражений. Это хорошо, потому что включает в себя как наследование, так и состав:
За исключением корневого выражения Constant, все остальные выражения являются выражениями и содержат одно или несколько выражений.
источник
Я буду использовать птиц в качестве примера
как курица, утка, орел
Я объясню, у обоих есть когти, клевки и крылья, но их атрибуты разные.
Цыплята не могут летать, не умеют плавать, могут есть червей, могут есть зерно
Утки не могут летать, могут плавать, могут есть зерно, не могут есть червей
Орел может летать, не умеет плавать, может есть червей, не может есть зерно
источник
Ваш типичный rails-clone предоставляет много практических примеров : у вас есть (абстрактный) класс базовой модели, который инкапсулирует все манипуляции с данными, и у вас есть базовый класс контроллера, который инкапсулирует все HTTP-коммуникации.
источник