Вот как я рассуждаю об этом:
использовать наследование только если роль/тип никогда не изменится. , например.
с помощью наследования для таких вещей, как:
< Fireman - Сотрудник < - Человек неправильно.
Как только Фредди пожарник сменит работу или станет безработным, вы должны убить его и воссоздать новый объект нового типа со всеми старыми отношениями, связанными с ним.
Таким образом, наивное решение вышеупомянутой проблемы заключалось бы в предоставлении свойства перечисления JobTitle классу person. Этого может быть достаточно в некоторых сценариях, например. если вам не нужны очень сложные поведения, связанные с ролью/типом.
Более правильным способом было бы дать классу человека список ролей. Каждая роль представляет собой, например, занятие с временным интервалом.
например.
freddy.Roles.Add(new Employement(employmentDate, jobTitle));
или, если это является излишеством:
freddy.CurrentEmployment = new Employement(employmentDate, jobTitle);
Таким образом, Freddy может стать разработчиком без того, чтобы мы сначала убить его.
Тем не менее, все мои брандмауэры до сих пор не ответили, если вы должны использовать иерархию перечисления или тип для названия jobtitle.
В чистом виде в памяти OO Я бы сказал, что правильнее использовать наследование для рабочих мест здесь.
Но если вы выполняете картографирование O/R, вы можете оказаться за чересчур сверхкомплексной моделью данных за кулисами, если картограф пытается сопоставить каждый подтип новой таблице. Так что в таких случаях я часто использую метод enum, если нет реального/сложного поведения, связанного с типами. Я могу жить с «if type == JobTitles.Fireman ...», если использование ограничено, и это делает вещи более легкими или менее сложными.
например. конструктор Entity Framework 4 для .NET может отображать только каждый подтип в новую таблицу. и вы можете получить уродливую модель или много соединений при запросе своей базы данных без какой-либо реальной выгоды.
Однако я использую наследование, если тип/роль статична. , например. для продуктов.
Возможно, у вас есть CD < - Товары и книги < - Продукт. Наследование выигрывает здесь, потому что в этом случае вы, скорее всего, имеете разные состояния, связанные с типами. У CD может быть несколько свойств дорожек, в то время как у книги может быть свойство количества страниц.
Короче говоря, это зависит ;-)
Кроме того, в конце дня вы будете, скорее всего, в конечном итоге с большим количеством заявлений переключателя либо образом. Допустим, вы хотите изменить «Продукт», даже если вы используете наследование, вы, вероятно, будет примерно такой код:
если (продукт книга) Response.Redicted («? ~/EditBook.aspx идентификатор» + product.id);
Поскольку кодирующая редактировать книги URL в классе сущностей было бы некрасиво, так как это заставит ваш бизнес entites знать о структуре сайта и т.д.
Это для объектной модели в памяти или ORM? Я не считаю пример «Животные» очень полезным, так как он не выполняет многие общие проблемы, с которыми вы сталкиваетесь при выполнении реального дизайна OO. – 2010-11-23 08:54:37
@Marcelo: согласовано. В частности, какой угол поведения? – sfinnie 2010-11-23 09:04:15
Собаки коры, кошки мяу, используя реализацию вашего коллеги, такое поведение будет сложно реализовать на C# (например). Он по-прежнему полезен в функциональных языках, таких как F #, где дискриминационные союзы являются очень мощным средством обеспечения полиморфизма. – 2010-11-23 09:32:39