2013-02-24 4 views
2

Je suis dans un peu d'un dilemme. J'ai classe animal, disons qu'il stocke des choses de base comme la position, etc .. Alors j'ai une classe smartAnimal qui s'étend animal. Disons smartAnimal ajoute une fonctionnalité de pouvoir prendre des décisions sans la participation de l'utilisateur. Maintenant, j'ai une classe dog qui s'étend animal. Il ne s'étend pas smartAnimal car il n'a pas besoin de cette fonctionnalité. Jusqu'à présent, je suis bon: un dog est un animal et un smartAnimal est un animal. Mais maintenant je veux smartDog que serait étendre smartAnimal mais smartDog devrait également être un dog. Par exemple, une grande partie de la fonctionnalité dog régulière, disons .sniff(), .poop(), et .bark() devrait aussi être dans mon smartDog mais ce ne sera pas le cas sauf si je copie littéralement + collez le code, car Java n'autorise pas l'héritage multiple.Architecture d'héritage appropriée dans Java

Composition semble inélégante parce que si j'avais:

class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }

... Je serais dupliquant les "trucs" dans animal, comme, par exemple, la position. Je devrais traiter avec deux ensembles de variables de position! Et les doublons de toutes les propriétés sont animal.

Héritant multiples interfaces ne sonne pas comme la solution appropriée soit, parce que disons dog était une interface, .sniff(), .poop(), et la mise en œuvre de .bark()ne devrait pas avoir à varier et être réimplémenté pour smartDog et tout autres classes.

Quelle est la meilleure pratique ici? Autrement dit, pour avoir les deux classes dog et smartDog?

EDIT:

De quelques-uns des commentaires/réponses, permettez-moi de préciser. Dans mon projet spécifique, un smartAnimal a réellement un réseau de neurones entier qui le contrôle. C'est beaucoup de code, et n'a pas de sens pour l'abstraire sur une interface. Le noyau de la fonctionnalité NN est le même quel que soit l'animal qui l'a, mais chaque sous-classe smartAnimal implémenterait différemment les sorties du "cerveau" AI. Inversement, chaque animal a sa propre fonctionnalité qui fonctionne de la même façon qu'un humain le contrôle ou que son propre agent d'IA le contrôle.

+1

'smartDog' devrait étendre' dog' –

+0

Mais alors je serais toujours dans la même situation, bien que vice versa, d'avoir à copier + coller la fonctionnalité 'smartAnimal' dans' smartDog' ... – honkbert

+1

Oh j'ai eu le point maintenant, il est difficile dans Java SE, plus simple en utilisant par exemple Scala ou IoC pattern. –

Répondre

3

La réponse est qu'il ne s'agit pas d'une hiérarchie d'héritage réaliste, ce que vous pouvez dire du fait que vous avez utilisé les mots "ajoute certaines fonctionnalités "pour décrire l'ajout de méthodes dans une sous-classe. Ce n'est pas un héritage approprié.Dans l'héritage approprié (Java, au moins), chaque méthode doit exister au niveau supérieur de la hiérarchie d'héritage. L'héritage est pour la réutilisation du code, pas pour l'ajout de fonctionnalités lorsque vous allez plus loin dans l'arborescence. Par conséquent, il n'y a pas vraiment de réponse à votre question.

+0

Il s'agit de savoir comment vous travaillez avec vos objets et si vous programmez des interfaces. Je ne vois aucune raison pour laquelle chaque méthode devrait exister au niveau de la hiérarchie seulement. –

+0

Oui, mais j'ai vu le "une orange est un fruit mais un fruit n'est pas (forcément) un orange" exemple plusieurs fois quand il s'agit de l'héritage.Si 'orange' étend' fruit', parce que 'orange' a des informations/fonctionnalités spécifiques pour être' orange', ce n'est pas un héritage approprié? – honkbert

+0

Ryan a raison et je recommanderais que cette question soit close car ce n'est pas vraiment une question de discussion et probablement trop large pour ce genre de forum Q & A. –

2

Je pense que ce que vous cherchez peut-être il y a la nouvelle JDK 8 fonctionnalité appelée « Mise en œuvre par défaut »

Je pense que la solution sage sans cela serait d'avoir le chien héritant smartAnimal. En tant que tel: Un smartDog est un chien qui est un animal intelligent.

Il est difficile d'avoir des conseils plus précis car cela dépend vraiment de la mise en œuvre de vos objets. (Ont-ils tous un état interne ou sont-ils seulement en train de définir de nouveaux comportements?)

+0

+1 ** cela dépend vraiment de la mise en œuvre de vos objets ** –

+0

Les objets sous-classifiés ont également leurs propres états internes. – honkbert

2

Puisque nous parlons ici de Java, le modèle est à héritage unique avec plusieurs interfaces. Cela étant dit, étant donné ces exemples, le bon niveau d'abstraction est approprié. Ce est, la réponse réside dans une combinaison de:

  1. héritage approprié (voir les livres sur GOF « est un », « a un » et comportements). Si vous vous trouvez en train de dire "un chien est intelligent" - c'est probablement un comportement d'un chien contre "un chien est un mamal" (notez le nom contre l'adjectif). Un chien «intelligent» présente certains comportements qui sont différents des chiens muets, mais les deux sont des «chiens» du point de vue de la modélisation des données.
  2. Agrégation correcte. Souvent, je trouve utile de casser des «choses» complexes dans leurs composants. Ainsi, une «voiture» est constituée d'un moteur, d'une transmission, d'un châssis, etc. Les chiens ont de la fourrure (couleur, texture, etc.), des jambes, des têtes, des formes de corps, etc. Séparer QU'EST-CE QUE le chien EST par rapport à comment il COMPORTE (smart = interface).
  3. Interfaces abstraites. Ce qui pourrait être difficile dans cet exemple est que ce que «intelligent» est peut varier entre différents types d'objets/noms. Un chien «intelligent» pourrait être en mesure de comprendre les commandes alors qu'un téléphone «intelligent» a certaines fonctionnalités comme le courrier électronique. Donc, "intelligent" peut ne pas être l'interface appropriée au plus haut niveau mais peut être associé à des "mammifères" -> "chien" étant un mammifère pourrait implémenter l'interface Mammal.Smart (étant spécifique aux Mammifères).

C'est en effet l'un des aspects les plus difficiles et les plus importants de la modélisation de l'information et de l'informatique dans son ensemble. Des groupes entiers de livres et d'études sont consacrés à ce sujet et peuvent donc ne pas convenir comme une question de dépassement de pile, destinée à fournir des réponses simples et directes à des questions concises simples.

Questions connexes