Вот как я рассуждаю об этом:
Используйте наследование только в том случае, если роль / тип никогда не изменится.
например
используя наследование для таких вещей, как:
Пожарный <- Сотрудник <- Человек не прав. </p>
как только пожарный Фредди сменит работу или станет безработным, вы должны убить его и воссоздать новый объект нового типа со всеми старыми связанными с ним связями.
Таким образом, наивным решением вышеуказанной проблемы было бы присвоить свойству enum свойство JobTitle.
Этого может быть достаточно в некоторых сценариях, например, если вам не нужно очень сложное поведение, связанное с ролью / типом.
Более правильным способом было бы дать классу человека список ролей.
Каждая роль представляет собой, например, работу с промежутком времени.
, например
freddy.Roles.Add(new Employement( employmentDate, jobTitle ));
или, если это излишне:
freddy.CurrentEmployment = new Employement( employmentDate, jobTitle );
Таким образом, Фредди может стать разработчиком без необходимости сначала его убивать.
Тем не менее, все мои сообщения все еще не отвечают, если вы должны использовать перечисление или иерархию типов для названия работы.
В чистом виде в mem OO я бы сказал, что здесь правильнее использовать наследование для рабочих титулов.
Но если вы выполняете O / R-сопоставление, вы можете получить немного сверхсложную модель данных за кулисами, если mapper попытается отобразить каждый подтип в новую таблицу.
Поэтому в таких случаях я часто использую подход enum, если с типами не связано реальное / сложное поведение.
Я могу жить с «если тип == JobTitles.Fireman ...», если использование ограничено, и это делает вещи проще и менее сложным.
например. конструктор Entity Framework 4 для .NET может сопоставлять только каждый подтип с новой таблицей. и вы можете получить некрасивую модель или множество объединений при запросе к базе данных без какой-либо реальной выгоды.
Однако я использую наследование, если тип / роль статические.
например для продуктов.
у вас может быть компакт-диск <- продукт и книга <- продукт.
Наследование выигрывает здесь, потому что в этом случае у вас скорее всего будет другое состояние, связанное с типами.
CD может иметь свойство количества дорожек, в то время как книга может иметь свойство количества страниц. </p>
Короче, все зависит; -)
Кроме того, в конце дня вы, скорее всего, в любом случае получите множество операторов переключения.
Допустим, вы хотите отредактировать «Продукт», даже если вы используете наследование, у вас, вероятно, будет такой код:
if (продукт Book)
Response.Redicted ("~ / EditBook.aspx? Id" + product.id);
Поскольку кодирование URL-адреса книги редактирования в классе сущностей было бы ужасно, так как это заставило бы ваших деловых людей узнать о структуре вашего сайта и т. Д.