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.
'smartDog' devrait étendre' dog' –
Mais alors je serais toujours dans la même situation, bien que vice versa, d'avoir à copier + coller la fonctionnalité 'smartAnimal' dans' smartDog' ... – honkbert
Oh j'ai eu le point maintenant, il est difficile dans Java SE, plus simple en utilisant par exemple Scala ou IoC pattern. –