10
votes

Comment hériter de deux classes

J'ai un personnes classe et étudiant et employé classes qui héritent d'elle. Mais si j'ai une personne qui est à la fois un étudiant et un employé ...

... Comment allez-vous continuer à implémenter cela?


8 commentaires

Je ne les ferais pas de cours. Alors, quel est le problème réel?


@Ordous pourquoi ne pas faire de cours?


@Sihanwang ce que exactement est le problème? Quelle fonctionnalité étudiant et employé doit avoir?


Cela ressemble à un mauvais design, pouvez-vous expliquer ce que vous voulez faire?


@Murinik C'est une question d'entrevue, je pense que vous pouvez faire une hypothèse ici.


@Marcoacierno C'est une question d'entrevue, je pense que vous pouvez faire une hypothèse ici


Étant donné que Java ne prend pas en charge de multiples héritages, vous avez essentiellement trois options: a) repenser la conception que les concepts d'entreprise dans la mise en page de classe ne sont pas toujours un bon ajustement. b) Utilisez des interfaces, vous pouvez implémenter plusieurs. c) Utilisez la composition (ayant un personnage personnelfo et un terrain étudiantInfo)


Dupliqué possible de Héritage multiple Java


5 Réponses :


4
votes

Puisque Java n'autorise pas plusieurs héritage, vous devez définir des interfaces pour étudiant et employé au lieu de hériter d'eux en tant que classes de base.


0 commentaires

4
votes

Ce que vous pouvez faire est, vous pouvez modifier le Employé de la classe public vers Employé d'interface publique , puis que vous puissiez faire L'étudiant de la classe publique étend aux gens implémente les employés < / code>

Vous devrez travailler comme ceci car en Java, une classe ne peut hériter que d'une classe au maximum. Bravo.


0 commentaires

16
votes

C'est un exemple classique d'un domaine problématique analysé de manière incorrecte. Oui, dans certaines situations, il peut être approprié de penser à "étudiant" comme type de "personne" et un "employé" comme type de "personne", mais - en fonction de votre domaine problématique - il ne peut pas non plus être approprié .

Si votre domaine exige que quelque chose soit à la fois un "étudiant" et un "employé", vous devez envisager si la relation entre "étudiant" et "personne" dans votre domaine "/ em> est vraiment un" est-une "relation.

Cela pourrait être que dans ce cas particulier, être un étudiant est simplement un attribut d'une personne particulière. John Doe est donc une personne qui peut également avoir une "occupation actuelle" de "étudiant". Dans ce cas, il peut avoir une liste de plusieurs «professions actuelles». Et la relation dans un tel monde devient "a-a-a" plutôt que "is-a". Donc, «étudiant» et «employé» deviennent des sous-classes de «occupation».


2 commentaires

Je reçois le point, mais je n'ai pas compris comment résoudre ce problème. Merci


C'est un peu difficile de vous donner un exemple concret, sans savoir ce que vous avez demandé de mettre en œuvre dans votre entretien. Peut-être devriez-vous ajouter le texte complet de la question de l'entretien à votre question initiale.



1
votes

en Java, il n'est possible que d'étendre une superclasse. Cependant, Java propose des interfaces et une classe peut prolonger plus d'une interface.

Vous pouvez organiser votre structure de classe comme ceci: xxx

alors que votre employeur peut être: < / p> xxx


dans le cas de personnes est une classe qui ne peut pas être changée que vous pouvez faire: xxx

La seule différence serait que l'étudiant et l'employé n'éloignaient pas les gens alors.


1 commentaires

Et si nous avons des cours de monde, cela ne peut pas changer



16
votes

Selon le commentaire:

C'est une question d'entrevue, je pense que vous pouvez faire une hypothèse ici p> blockQquote>

Si tel est le cas, la seule réponse correcte est de décrire vos hypothèses et de la manière dont vous les adressez. p>

Si vous adhérez strictement aux exigences, vous pouvez faire Étudiant code> et des interfaces CODE> les interfaces et ont différentes classes les implémenter: p>

Person person = new Person("John Doe", 21, Sex.Male);
person.addRole(new Student("Stack Overflow University"));
person.addRole(new Employee("Secret Government Spy"));


7 commentaires

C'est la première fois que je vois la deuxième solution. Dans ce cas, comment pourrait instancier pour une personne qui sont étudiant et employé? Merci


@Sihanwang j'ai édité ma réponse avec un exemple de la façon dont cela peut être fait.


Si nous voulons avoir un étudiant, utiliserions-nous une fonction addrole de personne ou utilisez-vous simplement une classe d'étudiants?


@Sihanwang dans la deuxième mise en œuvre - vous auriez une personne , avec un seul étudiant . S'il s'agit d'une usecase commune, cela pourrait valoir la peine d'ajouter un constructeur avec un Set ou même Paramètre en tant que sucre syntaxique: Nouvelle personne ("John DOE ", 21, SEX.MALE, COLLECTIONS.SINGLETON (nouvel étudiant (" NYU "))) ou même Nouvelle personne (" John Doe ", 21, Sex.MAle, nouvel étudiant (" NYU ")))


C'est très beau design.


Je suis nouveau à Java, est-il désavantage pour la deuxième solution comparant avec le premier?


@Sihanwang Le problème principal, IMHO, est que vous n'avez pas de bon moyen de limiter les types de personnes que vous pouvez passer à la méthode. Par exemple, ce sera assez maladroit de créer une classe de classe qui détient une liste d'étudiants, alors que dans la première solution, vous pourriez disposer simplement de disposer de de classe (liste <étudiant>) . En fin de compte, à tous, se résume à quelles sont les exigences.