Когда класс B наследуется от класса A, должно ли это быть так: «класс B - это класс A»? - PullRequest
3 голосов
/ 08 июня 2009

В книге написано

Имя класса имеет свойство фамилия и имя.

Адрес наследуется от имени и имеет дополнительное свойство номера улицы, название улицы, город, штат, почтовый индекс.

Это похоже на другие случаи, когда

Кошка наследует от Animal, а Cat "is-a" Animal.

Требуется или является ли это обязательное отношение для хорошего проектирования объекта? Должен ли адрес наследоваться от имени?

Обновление: , так как некоторые пользователи спрашивают источник: альтернативный текст http://img192.imageshack.us/img192/8903/learningrubyp133smaller.png

Ответы [ 6 ]

13 голосов
/ 08 июня 2009

Нет, я не думаю, что адрес должен наследоваться от имени. Они не имеют ничего общего, кроме одного строкового поля. Адрес не должен иметь фамилию.

Наследование следует использовать только тогда, когда существуют сильные и четкие отношения, в которых какое-то поведение расширено.

Следует отдавать предпочтение композиции, а не наследованию, поскольку она допускает слабую связь и динамическое изменение поведения.

4 голосов
/ 08 июня 2009

В этом случае ваша книга злоупотребляет ориентацией объекта только для того, чтобы избежать необходимости переопределять несколько переменных. Концептуально это просто неправда, что Адрес - это Имя. Было бы более естественно, чтобы объект Address содержал ссылку на объект Name (резидент по указанному адресу).

4 голосов
/ 08 июня 2009

Да, наследование предназначено именно для отношений "есть". В случае Name и Address было бы, возможно, более элегантно иметь составной класс Person, который имеет переменные-члены типов Name и Address.

Но для случаев, когда действительно каждая сущность класса Address также имеет те же свойства, что и наследование класса Name, допустимо. Опять же, это зависит от того, как это будет работать в реальной проблеме, это не общий вопрос.

2 голосов
/ 08 июня 2009

В целом: если класс D наследуется от класса B, то D является B.

В C ++: если класс D наследует в частном порядке от класса B, то D не является B, поскольку никто не знает. Страуструп думает об этом как об альтернативе композиции. Я бы посчитал это одной из ошибок в дизайне C ++ именно по той причине, что в моем понимании слово «наследует» должно быть синонимом слова «является».

2 голосов
/ 08 июня 2009

Если класс B можно использовать там, где ожидается класс A, тогда у вас есть наследование "is-a" (см. Принцип подстановки Лискова ). В противном случае вы просто расширяете класс новым поведением.

Адрес может наследоваться от класса Name (я не согласен), но вы не должны рассматривать как имя.

2 голосов
/ 08 июня 2009

Да. Когда ваш класс B - это класс A, тогда вы можете использовать наследование. То есть в таких ситуациях можно разрешить классу B быть подклассом класса A.

В ситуациях, когда эти отношения неясны, вам следует рассмотреть композицию, а не наследование (имеет-отношение вместо is-отношения).

То есть пример в вашей книге кажется неправильным. Адрес это не имя. Хотя у адреса может быть имя, поэтому следует использовать композицию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...