2017-10-14 18 views
0

Comment convertir une instance d'une classe en une sous-classe et ajouter des propriétés afin qu'une classe ClassCastException ne soit pas générée? Par exemple:Ajouter des propriétés à une instance de superclasse pour le transformer en instance de sous-classe

public class Shape { 
    private int length; 
    private int width; 
    public Shape(int length, int width) { 
    this.length = length; 
    this.width = width; 
    } 
} 
public class Solid extends Shape { 
    private int height; 
    public Solid (int length, int width, int height) { 
    super(length, width); 
    this.height = height; 
    } 
} 
public class Test { 
    public static void main(String[] args) { 
    Shape shape = new Shape(1, 2); 
    //Do something to change the shape instance to solid instance. 
    Solid solid = (Solid) shape;//Makes it does not throw ClassCastException. 
    System.out.println(shape instanceof Solid);//Makes it print true. 
    System.out.println(shape == solid);//Makes it print true. 
    } 
} 

Je sais que je peux créer une nouvelle instance de solide et d'importer les propriétés de l'ancienne instance, mais je veux ajouter des propriétés à l'ancienne instance à la place si l'on compare avec == retourne vrai. Des idées?

+4

Vous ne pouvez pas changer le temps d'exécution type d'un objet une fois que vous l'avez créé. Si vous voulez créer une instance de 'Solid', changez simplement votre première ligne en' new Solid (1, 2, 3) '. Ce que vous essayez d'accomplir n'est pas très clair, pour être honnête. –

+0

@RcExtract Veuillez mettre à jour votre question pour inclure la raison pour laquelle vous souhaitez ajouter une propriété supplémentaire à une classe existante à partir d'une bibliothèque externe. Qui réagirait sur cette nouvelle propriété lorsqu'elle n'est pas définie par la classe/bibliothèque d'origine? Cela ressemble à un problème XY, peut-être que vous devriez indiquer votre problème d'origine. – Progman

Répondre

1

Vous pouvez obtenir à ce que vous voulez en ajoutant un constructeur à Solid qui accepte Shape comme argument:

public Solid (Shape shape) { 
    this(shape.getLength(), shape.getWidth(),0); 
} 

et le test est:

Shape shape = new Shape(1, 2); 
shape = new Solid(shape); 
System.out.println(shape instanceof Solid);//prints true. 
Solid solid = (Solid) shape; 
System.out.println(shape == solid);//prints true. 
+0

Je ne veux pas que la seconde instance soit créée. C'est ma situation. Un programme crée une instance de la classe A. Ensuite, je veux lui ajouter des propriétés, mais je ne peux pas créer une nouvelle instance de classe A dans l'extension du programme car elle devrait être créée par le programme lui-même. Puis-je ajouter des propriétés à l'instance A créée par le programme sans créer de classe wrapper? – RcExtract

+0

Une autre option est d'utiliser 'Solid' uniquement: avoir un constructeur' Solid (longueur int, largeur int) 'qui est en fait un' Shape', et ajouter un attribut ou un drapeau comme 'isSolid' – c0der