2014-08-28 3 views
0

J'ai un problème avec une classe étendue.Mettez dans la classe étendue la classe parent

Ce sont les classes:

class A{ 
} 

class B extends A{ 
} 

Maintenant, le problème est que j'ai une méthode qui retourne A, quelque chose comme ceci:

public A doSomthing(){ 
} 

Et maintenant, j'essaie de faire quelque chose comme ceci:

public static void main(){ 
    B b = new B(); 
    b = doSomething(); 
} 

Mais cela ne semble pas fonctionner. Y a-t-il un moyen de résoudre ce problème?

La seule chose que je pensais est-il d'avoir quelque chose comme ceci:

class B extends A{ 
public B(A a){ 
    copy all the fields from A to B} 
} 

Et puis faire:

A a = new A(); 
a = doSomthing(); 
B b = new B(a); 

Y at-il une meilleure option?

+0

Pouvez-vous préciser ce que 'doSomething()' est censé faire? Il semble que vous l'utilisiez comme [méthode d'usine] (http://en.wikipedia.org/wiki/Factory_method_pattern). –

Répondre

0

Vous instanciez votre objet b être de type B au lieu de A donc polymorphism ne fonctionnerait pas lorsque vous appelez doSomthing

Changer votre objet b être de type A

+0

oui mais je ne peux pas faire quelque chose comme: b.SomeMethodADontHave(); – etlsh

+0

@ user3659858 Regardez la partie de Jon Skeet sur l'utilisation de Composition à la place sur l'héritage. – gtgaxiola

3

Fondamentalement je pense que vous avez manqué ce l'opérateur d'affectation fait. Cette déclaration:

b = doSomething(); 

modifie la valeur de b à tout ce que la méthode retourne doSomething(). Il ne dépend pas de la valeur existante de btout. Ainsi, de même, quand vous avez:

A a = new A(); 
a = doSomthing(); 

... il serait plus logique d'écrire:

A a = doSomething(); 

Maintenant, si vous devez créer une instance de B basée sur une instance de A, puis il se pourrait bien donner un sens à écrire:

A a = doSomething(); 
B b = new B(a); 

ou tout simplement:

B b = new B(doSomething()); 

... mais vous devez comprendre quand les valeurs existantes sont utilisées et quand elles ne le sont pas.

Habituellement je trouve que quand je dois faire quelque chose comme ça, il est en fait préférable d'utiliser la composition que l'héritage de toute façon - que B devrait avoir une référence à un A existant plutôt que d'étendre A. C'est certainement quelque chose à considérer, mais sans un exemple concret, nous ne pouvons pas dire avec certitude.

+0

Je préfère la façon dont j'écris, il est plus pratique et plus sûr de déclarer la variable avant l'affectation. surtout si vous faites le devoir uniquement à l'intérieur si/essayez ... – etlsh

+0

+1 Composition sur l'héritage! – gtgaxiola

0

Java ne possède pas d'héritage multiple (c# example) pour appliquer des signatures de méthode.Au contraire, il serait logique de

public static A doSomthing(){ 
    A result = new A(); 
    ... 
    return result; 
} 

Ensuite, vous pouvez utiliser:

A a = A.DoSomthing(); 
B b = (B)A.DoSomthing(); 
Questions connexes