2016-03-26 7 views
3

Also habe ich diese Klasse namens Card, in dieser Klasse habe ich ein Bild, ich habe dann mehrere andere Klassen, die diese Klasse und diese Klassen erben.Veränderte Variablentyp in Elternklasse

Ich habe beschlossen, eine neue Klasse zu erstellen, die Image stattdessen jetzt erweitert und diese anstelle der Image-Klasse in meiner übergeordneten Card-Klasse verwendet. Aus diesem Grund hat es jedoch alle anderen Klassen, die eine Image-Variable übergeben, durcheinander gebracht.

Muss ich alle Instanzen der alten Image-Klasse in die neue CardImage-Klasse ändern oder gibt es einen anderen Weg?

Beispiel:

public class A { 
    private Image image; 

    public A(Image image){ 
    this.image = image; 
    } 
} 

public class B extends A{ 

    public B(Image image){ 
    super(image); 
    }  
} 

public class CardImage extends Image{ 
    public CardImage(){ 

    } 
} 
+0

Sie sollten 'CardImage'-Instanzen an die Konstruktoren von' A' und 'B' in Ihrem angegebenen Code übergeben können. Was genau ist "durcheinander"? – schwobaseggl

+0

Wie versaut es alle anderen Klassen? Mit dem, was Sie jetzt haben, sollte es immer noch funktionieren, weil alle CardImage-Objekte Image-Objekte sind –

+0

Wenn ich versucht, meine Image-Variable in der Card-Klasse zu einer CardImage-Klasse zu ändern, klagt es über inkompatible Typen – bob565

Antwort

1

Wenn alle Klassen nur die CardImages dann verwenden alle von ihnen zu ändern können meaningfull sein. Aber wenn nur die Klasse A die CardImage verwendet, dann ändern Sie nichts. Gießen Sie einfach Image zu CardImage in A und verwenden Sie es. Da jeder CardImages auch ein Image ist, wird Compiler Sie nicht drücken, um Parametertypen zu ändern.

public class A { 
    private Image image; 

    public A(Image image){ 
    this.image = image; 
    } 

    public void methodWhichNeedsCardImage() { 
    if(image instanceof CardImage) { 
     CardImage cImage = (CardImage) image; 
    } 
    } 
} 
+0

Hallo, vielen Dank für die Antwort, ich habe dies schon früher versucht, aber es kommt mit dem Fehler "Ausnahme im Thread" java.lang.ClassCastException: com.badlogic.gdx.scenes.scene2d.ui.Image kann nicht umgewandelt werden com.mygdx.cards.CardImage " – bob565

+0

Dann benutze' instanceof'. Es sieht so aus, als ob du die Klasse 'A' nicht immer mit' CardImage' erstellst. – rdonuk

+0

Das ist geschafft! Danke, das war genau das, was ich brauchte. :) – bob565

1

Gute Software-Design erspart Ihnen die Kopfschmerzen und Fehler, die entstehen, wenn Sie Cascading Änderungen an Ihrem Code vornehmen müssen. Wenn Sie sich denken, "hmm, wenn ich diese kleine Veränderung mache, muss ich jeden Bezug auf die XYZ-Klasse ändern", dann machen Sie wahrscheinlich etwas falsch.

Nun zu Ihrer Frage: Wenn es darum geht, auf Erbschaft erstreckt Image impliziert, dass jede Instanz von CardImage selbst Image. Daher ist es absolut zulässig, einen CardImage an den Konstruktor der Klasse A oder B wie in Ihrem Beispiel zu übergeben.

Hinweis: Wenn Sie die Image Klasse erweitern, müssen Sie vorsichtig sein, wenn/wenn Sie seine Methoden überschreiben, die Sie seine Methode eingegangene Verpflichtungen einhalten (zum Beispiel der hashCode Methode). Solange Sie die Verträge der Superklasse einhalten, sollte Ihre Erweiterung Ihren Code nicht beschädigen.

Also, stellen Sie sicher, dass Sie die richtige Klasse erweitern: com.badlogic.gdx.scenes.scene2d.ui.Image

+0

Hallo, danke für die Antwort und das ist Was ich anfangs dachte, aber als ich versuchte, meine Image-Variable zu ändern, gab es mir einen Fehler, dass es ein inkompatibler Typ war. – bob565