2009-06-08 8 views
3

Dans un livre, il ditLorsque la classe B hérite de la classe A, doit-elle être que "la classe B est-une classe A"?

le nom de classe a la propriété de nom et prénom.

Adresse héritée de Nom, et a propriété supplémentaire du numéro de rue, nom de la rue, ville, état, code postal.

Cela semble différent des autres cas, où

Cat hérite d'un animal, et Cat "est-un" animal.

Cette relation «est-ce» est-elle obligatoire ou obligatoire pour la conception d'un bon objet? L'adresse doit-elle hériter du nom?

Mise à jour: parce que certains utilisateurs ont demandé la source: alt text http://img192.imageshack.us/img192/8903/learningrubyp133smaller.png

+16

Mauvais livre. Exemple classique d'héritage abusé. –

+1

Pourriez-vous fournir le titre et l'auteur du livre? Cela semble être une décision de conception bizarre. Êtes-vous sûr d'avoir le contexte correct? –

+1

Apprendre Ruby, p.133, O'Reilly 2007 –

Répondre

13

Non, je ne pense pas que cette adresse doit hériter de Name. Ils n'ont rien en commun, sauf pour un champ de corde. Une adresse ne devrait pas avoir de nom de famille.

Inherritance ne doit être utilisé que lorsqu'il existe une relation forte et claire où un certain comportement est prolongé.

On devrait favoriser la composition plutôt que l'hérédité, car cela permet un couplage lâche et un changement de comportement dynamique.

+0

Vous pouvez également utiliser l'héritage pour réutiliser le code, mais cela génère rapidement des hiérarchies profondes, qui sont une odeur de code. Donc, je ne conseillerais pas de le faire. –

+1

+1 pour la composition dans ce cas. L'extension du nom pour devenir une adresse est définitivement faux. – Joey

4

Oui, l'héritage est exactement "est-une" relation. Dans le cas de Name and Address, il serait peut-être plus élégant d'avoir une classe composite Person qui a des variables membres de type Name et Address.

Mais pour les cas où en effet chaque entité de la classe Address a également les mêmes propriétés que l'héritage de la classe Name est acceptable. Encore une fois cela dépend de comment cela va fonctionner dans un vrai problème, ce n'est pas une question générale.

4

Dans ce cas, votre livre abuse de l'orientation de l'objet pour ne pas avoir à redéfinir quelques variables. Conceptuellement, il n'est tout simplement pas vrai que Address "is-a" Name. Il aurait été plus naturel que l'objet Address contienne une référence à l'objet Name (le résident à l'adresse donnée).

2

Oui. Lorsque votre classe B est une classe A, vous pouvez utiliser l'héritage. Autrement dit, dans de telles situations, il est acceptable de laisser la classe B être une sous-classe de la classe A. Dans les situations où cette relation n'est pas claire, vous devez envisager la composition au lieu de l'héritage. (a-une relation au lieu de est-une relation). C'est-à-dire que l'exemple de votre livre est erroné. L'adresse n'est pas un nom. L'adresse peut avoir un nom, donc la composition devrait être utilisée.

2

Si la classe B peut être utilisée lorsqu'une classe A est attendue, alors vous avez l'héritage "est-a" (voir Liskov substitution principle). Sinon, vous développez simplement une classe avec de nouveaux comportements.

L'adresse peut hériter de la classe Name (je ne suis pas d'accord) mais vous ne devriez pas traiter comme un nom.

2

En général: si la classe D hérite de la classe B, D est un B.

En C++: si la classe D hérite privée de la classe B, D est pas un B puisque personne ne sait. Stroustrup pense à cela comme une alternative à la composition. Je considérerais cela comme l'une des erreurs dans la conception de C++ précisément pour la raison que, dans ma compréhension, «hériter» devrait être synonyme de «est un».

Questions connexes