2010-06-06 4 views
0

Si un père est un parent et un parent est une personne et une personne a un Père, je crée les éléments suivants:héritage POO étendre

class Person{ 
    Father father; 
} 
class Parent extends Person{} 
class Father extends Parent{} 

instances:

Person p1 = new Person(); 
Person p2 = new Person(); 
p1.father = p2; //father is of the type Father 

Cela ne travail ... Maintenant essayez de lancer ::

Person p1 = new Person(); 
Person p2 = new Person(); 
p1.father = (Father)p2; 

Cela ne fonctionne pas non plus.

Qu'est-ce qui fonctionne pour ce cas?

+0

Vous posez des questions sur une langue spécifique? Si oui, lequel? –

Répondre

1

En fait, Père n'est pas une sous-classe de personne. C'est juste une relation.

class Person { 
    Person father; 
} 
+0

À moins que cette personne spécifique doive faire quelque chose comme doParent (Personne autre) .. Une interface pourrait être plus agréable si! –

+0

Chaque personne a un père, chaque personne peut avoir un ou plusieurs enfants, donc chaque personne aurait cette méthode. – Maxem

+0

Tout d'abord, je suis d'accord si cela correspond aux besoins. Mais parfois, cette généralisation pourrait ne pas suffire. Pour l'amour de l'argument, et si nous devons aussi garder la trace de la mère? Une mère peut allaiter, un père ne peut pas. Motif décorateur peut-être? J'essaie juste de m'apprendre, pas de discuter! –

0

Vous ne pouvez pas effectuer de conversion comme ça. Votre père est et non un un père ne peut donc pas travailler avec quelqu'un. Vous pouvez seulement lancer quelque chose que l'objet est.

Person p1 = new Person(); 
Person p2 = new Father(); 
p1.father = (Father)p2; 

Ou directement:

Father p2 = new Father(); 
p1.father = p2; 

Mais être un père n'est pas une bonne différenciation dans la hiérarchie des classes. Je ne créerais probablement pas une propre classe pour cela: être un père est juste l'un des nombreux rôles qu'une personne remplit donc je voudrais supprimer cette classe et déclarer le membre father comme un Person régulier. Idem pour Parent.

+0

Je souhaite attribuer des propriétés à un père et à un parent. Dans ce cas, ce ne sont pas des relations, mais des objets par eux-mêmes. – hsmit

+1

@hsmit: C'est tout simplement un mauvais design. Votre décomposition du problème est en faute. Si vous voulez ajouter des propriétés supplémentaires, utilisez la composition au lieu de l'héritage. L'héritage n'est tout simplement pas adapté pour modéliser vos besoins. –

+0

Que proposez-vous – hsmit

1

La chose la plus évidente est que le Père est une personne. Une personne ne doit pas être un père, quand il s'agit de l'instance concrète. Cet exemple spécifiquement, fonctionnerait si votre champ père était de type Person, ou vous instanciez p2 comme un nouveau père.

+0

Je suis d'accord. Je choisis pour le dernier: p1.father = new Father (p2); Mais comment dois-je pousser toutes les valeurs de p2 dans la personne super classe? – hsmit

+0

Appelez simplement le constructeur de la personne du constructeur du père - super (1,2,3) –