11 Réponses :
Il n'y a personne la meilleure solution. Vous voudrez peut-être faire un wiki communautaire, car c'est généralement la pratique acceptée pour les questions subjectives.
Je penserais à ce qui ferait la meilleure classe des parents pour les hiérarchies et tenter de comprendre ce que "meilleur" signifie Dans ce contexte. P>
Tout ce qu'il y a des choses, ce qui pourrait avoir un attribut de nom. Mais tout ce qui existe à un certain niveau est la nourriture; Si cela peut manger quelque chose, quelque chose peut le manger. Je pourrais faire de la nourriture la classe mère et lui donner une méthode qui renvoie un booléen à vérifier si l'objet de paramètre peut manger l'objet actuel. P>
donc, p> Cela semble la hiérarchie de la classe la plus simple qui convient à tout ce dont je pourrais avoir besoin sur une première passe? P> Cela dit, le rôle important dans la plupart des questions d'entretiens est la sensation que vous obtenez pour la personne interrogée, pas tellement la réponse exacte qu'ils donnent. p> p>
Eh bien, voici un bon que je suis venu avec - Utilisation du dépassement de l'OOP, de la sous-classe et de la superclasse:
Plant grass = new Plant(); Herbivore deer = new Herbivore(); deer.eat(grass); // ok Plant grass2 = new Plant(); Carnivore tiger = new Carnivore(); tiger.eat(grass2); // not ok. Meat deer2 = new Meat(); tiger.eat(deer2); // ok
Townvoted, parce que vous avez classé un cerf comme animal à un endroit et comme nourriture dans une autre. Le même exemple de cerf peut être à la fois; Le tigre peut attaquer le cerf alors qu'il mange de façon raisonnable vos arbustes.
Je sais que c'est un problème que j'ai assisté ici essayant de résoudre. Je vais devoir créer une nouvelle classe et faire des cerfs pour pouvoir aller 2 façons. N'oubliez pas: Seulement la bownvote si le poste est entièrement inutile et ne vaut pas la peine pour les autres de voir et vous devriez probablement avoir une meilleure réponse.
Mauvais modèle: Si le tigre reçoit de l'herbe, elle revenait à la méthode mange () par défaut () code> pour tous les animaux. Vous devez ajouter une fonction qui jette une exception (ou jette le zookeper) si vous essayez de nourrir l'herbe au tigre.
En alimentant le mauvais objet, une exception aurait déjà été lancée automatiquement à cause de la signature de méthode qui avait été remplacée.
-1, c'est une question ouverte, il n'y a pas de "bonne" réponse; Ce qui est plus important, c'est votre train de pensée, pas le résultat réel que vous venez.
De toute façon, il n'y a pas de "mauvaise" réponse aussi. @Asen tu as raison.
Mon point est que votre réponse fournit principalement un code, avec peu (le cas échéant) discussion
Le code explique tout. Désolé je suis plus codant que la personne d'explication. Si vous pensez que vous pouvez améliorer la réponse, n'hésitez pas parce que c'est la communauté wiki!
Pourquoi avez-vous besoin d'une barre de défilement pendant 13 lignes de code?
Il y a une magnifique affiche pour le Principe de substitution de Liskov qui dit: "Si cela ressemble à un Canard, des charnières comme un canard, mais ont besoin de piles, vous avez probablement une mauvaise abstraction. " Et c'est la réponse rapide - Certains des objets peuvent être à la fois des animaux et des aliments, de sorte que vous ne souhaitrisez pas aller la voie de multiples héritage, le schéma de classification est tout faux. P>
Une fois que vous avez effacé cet obstacle, le reste est ouvert et vous pouvez apporter d'autres principes de conception. Par exemple, vous pouvez ajouter une interface iedible qui permet de consommer des objets. Vous pourriez aller à l'image et ajouter des décorateurs pour carnivore et herbivore, et cela permettrait la consommation de la seule classe d'objets. P>
Le point est de pouvoir penser sur vos pieds, de voir et d'expliquer divers aspects d'un problème et de communiquer bien. Et peut-être pas em> pour rester coincé sur une limitation «une réponse à droite». P>
Voici quelques réflexions sur cette question d'entretien: p>
Je suis d'accord avec Cylon Cat: Ce type d'abstraction ne fonctionne pas bien sans héritage multiple (même si c'est des interfaces comme java.) p>
Je créerais deux formes d'héritage: p>
Animal: P>
nourriture: p>
La méthode "manger" des deux types d'animaux (j'ignore les omnivores, les insectivores et de nombreux autres types) seraient spécialisés pour les différents types de nourriture. Si nous utilisons une langue comme Java, la nourriture serait une interface. P>
Je lui dirais de gratter ça. C'est une abstraction horrible. Sans parler de ce que nous n'avons donné aucun contexte. Les abstractions ne sortent pas d'air mince ou de "idée" de ce qui est "juste". Montrez-moi quel problème essayez-vous de résoudre en premier, afin que nous puissions évaluer cette abstraction.
Si aucun contexte n'est fourni, je vais simplement supposer / maquiller my propre: vous voulez que certains types d'objets puissent être capables de manger d'autres types d'objets. Rien de plus, rien de moins. P>
faire une interface Donc, tout ce dont nous avons besoin pour cette interface est un Pour la vérification des erreurs, vous pouvez créer un tas de mangeable code> (ou vous pouvez appeler cela
aliment code>, si vous voulez), et puisque nous n'avons pas de contexte Quoi de fois, je suppose que c'est un programme de console de jouet, qui imprime simplement: p>
getfourname () Code> Méthode. P>
ISXFoodType code> méthodes, par exemple,
isgrassfoodype () code>,
ismeatfoodype ( ) code>, etc. La mise en oeuvre
code> de
mangez (mangeable e) code> vérifierait
isgrassfoodype () code>, et quand échoue , Imprimés: P>
"Cow can't eat " + e.getFoodName()
-1. Le polymorphisme est donc de sorte que nous n'avons pas besoin d'écrire du code qui examine les types à l'heure d'exécution, tels que les méthodes ISXFOODTYPE.
@outis: le purisme comme celui-là est mauvais pour votre santé.
Alan Kay, qui a inventé le terme "Programmation orientée objet", a déclaré que "OOP pour moi ne signifie que la messagerie, la rétention et la protection locales et la dissimulation de processus d'État, et une extrême contraçance tardive de toutes choses". p>
essayer de résoudre ce "problème" dans le modèle de données me semble telle que le contraire de la contraction tardive: pourquoi avez-vous besoin du compilateur pour l'appliquer? Je ne me soucierais pas de changer le modèle du tout. Si vous êtes passé quelque chose que vous ne pouvez pas manger, vous lancez une exception - comme dans la vie réelle, à peu près! P>
Tout animal est de la nourriture, tout légume est de la nourriture. Et en fait, un tigre peut être mangé par une vache. (La tremblante de la maladie des prions est répandue en alimentant un tissu neuronal des moutons infecté aux moutons non infectés.) P>
Vous pourriez avoir une hiérarchie d'espèces, ala Linnaeus , animal et légume . Chaque espèce est un singleton et possède une liste Et si votre seul problème est d'enregistrer un régime alimentaire pour chaque espèce, les multiples classes d'espèces sont inutiles. Il suffit d'avoir une seule classe d'espèces avec le nom de l'espèce comme une variable d'instance et la liste
Si vous vous attendez à ce que le système soit très important, je suggérerais une plante de sous-classement / de viande et d'herbivore / carnivore / omnivore. P>
S'assurer que le système dispose d'une interface standard pour toutes les plantes / animaux appelées GetFoodName () et GetFoodType (), vous pouvez le faire respecter en créant une classe mère pour les plantes / animaux appelés espèces. P>
Le problème que je verrais avec l'usine de sous-classement / viande et carnivore / herbivore est qu'un meerkat est carnivore, mais il ne peut probablement pas manger de rhinocéros (il peut y avoir un meilleur exemple), de sorte que certaines restrictions sont nécessaires au-delà de "i Mangez de la viande, vous mangez des plantes ». P>
S'il n'allait pas devenir incroyablement grand et que vous vouliez être névrosé à ce sujet, vous pourriez stocker des énumités statiques d'aliments admissibles pour chaque sous-classe d'animaux. Donc, le tigre pouvait stocker cerf, antilope, etc. p>
La nourriture devrait être une interface, donc plante et animal pourrait aussi être de la nourriture.
La classe d'animaux abstraite doit avoir la méthode qui prend des aliments comme paramètre. P>
Sous-classes de l'animal: carnivore, herbivore et omnivore devraient avoir leur propre version de manger. p>
par exemple pour carnivore: p> Les problèmes résolus. P> mais pour un meilleur design, carnivore, herbivore et omnivore devrait Soyez aussi des interfaces, car elles ne sont pas la bonne façon de marquer les animaux. P> p>
Ceci est facile avec des génériques en C # BTW:
var human = new Human(); var tiger = new Tiger(); var cow = new Cow(); var plant = new Plant(); human.Eat(cow); tiger.Eat(human); cow.Eat(tiger); // this doesn't compile tiger.Eat(plant); // neither does this
Je pense que c'est une horrible question pour une interview. Donner des abstractions sans contexte n'est pas conçu, c'est BS.
Je rencontre une question similaire auparavant.