2013-01-03 9 views
3

J'ai du code Java similaire à cela avec beaucoup d'instructions Sinon si:Initialiser objet et le créer plus tard en fonction de la valeur si la déclaration

if(...){ 
    Object1 obj = new Object1(); 
    String text = obj.getString(); 
    int number = obj.getInt(); 
    //do something 

}else if (...){ 
    Object2 obj = new Object2(); 
    String text = obj.getString(); 
    int number = obj.getInt(); 
    //do something 
... 

est-il possible, en quelque sorte, d'écrire du code de cette façon:

<something> obj; //<- ? 

if(..) 
    obj = new Object1; 
else if(..) 
    obj = new Object2; 
... 
String text = obj.getString(); 
int number = obj.getInt(); 
//do something 

merci pour l'aide. PS: Vous pouvez écrire une solution en C++; Je vais le découvrir pour Java

PS (2): Désolé pour le mauvais anglais - ce n'est pas ma langue maternelle

Répondre

2

Une alternative ci-dessus serait une interface

public interface Ibase { 
    String getString(); 
    int getInt(); 
} 

que vos deux objets seraient alors mettre en œuvre cette interface assurant qu'ils ont les méthodes disponibles.

public class Object1 implements IBase { 
public String getString() { 
    return "string"; 
} 

public int getInt() { 
    return 0; 
} 
} 

alors comme ci-dessus peuvent utiliser

IBase object = null 
if(option) 
    object = new Object1() 
else 
object = new Object2(); 

object.getString(); 
object.getInt(); 

penser à l'interface comme un contrat que les sous-classes doivent respecter.

+0

nice, je vais essayer ... il n'est donc pas nécessaire de lancer des méthodes/objet comme: String text = (cast) object.getString() ? –

+0

il ne sait pas en fonction de l'interface que 'getString()' retournera une chaîne. – AbstractChaos

3

Dans les deux cas, vous aurez besoin d'une classe de base. Pour les deux, vous pouvez avoir d'abord une NULL référence (Java) ou pointeur (C++), que vous définissez ensuite:

BaseObject* pBase = NULL; 
if (...) 
    pBase = new Object1; 
else 
    pBase = new Object2; 

En Java, il ne serait pas si différent (asterix manquant et null au lieu de NULL);

+0

Merci pour la réponse, je craignais qu'une autre classe soit nécessaire:/ –

+0

@ SanjinKurelić en Java, c'est facile à cause de la base 'Object' (bien que vous pourriez avoir besoin d'une nouvelle classe de base, selon les besoins), en C++ une base générique n'existe pas. –

3
Object obj = null; 
if(..) 
    obj = new Object1(); 
else if(..) 
    obj = new Object2(); 

Cependant, sachez que pour le compilateur, obj est de type Object. Vous ne pouvez pas appliquer des méthodes spécifiques à Object1 ou Object2 sans diffusion directe.

+0

donc quand j'appelle la méthode, j'ai besoin d'écrire int nombre = (Object1) obj.getInt(); –

+0

@ SanjinKurelić oui, c'est vrai. Vous pouvez également définir une interface commune de Object1 et Object2, voir la réponse de AbstractChaos – gefei

Questions connexes