2016-12-09 4 views
0

Ich habe hier ein einfaches Beispiel, nur um das Problem zu zeigen Ich habe: Ich habe eine Karte Klasse, mit Eigenschaft "Preis".
Von dieser Karte Klasse habe ich 2 Kinder, Kupfer Klasse und Silber Klasse, jeweils mit dem Preis sie erben und mit ihren gewonnenen Wert. Jetzt mache ich eine ArrayList "Hand", in die ich 2 Kupferkarten und 1 Silberkarte einlege. Bis hier, OK. mit der Anweisung System.out.println (hand.get (0)); Ich bekomme "Ich bin eine Kupferkarte" was in Ordnung ist. Mit System.out.println (hand.get (0) .getClass()); Ich bekomme "Klasse Copper", was auch OK ist. ABER, System.out.println (hand.get (0) .getValue()); dos funktioniert nicht, die getValue() Methode von Copper ist nicht zugänglich, nur die getPrice() Methode aus der Card Klasse .. Ich habe mir ähnliche Probleme hier angesehen aber keine Antwort funktioniert .. Wer kann mer helfen! Danke vielmals! hier
PS ist der CodeEigenschaften und Methoden von Kind-Objekten in ArrayList nicht sichtbar

public class Card { 

    int price; 
    public Card(int price) { 
     this.price = price; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public String toString() { 
     return new String ("I am a card"); 
    } 
} 

public class Copper extends Card { 

    int value; 
    public Copper(int price, int value) { 
     super(price); 
     this.value = value; 

    public int getValue() { 
     return value; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public String toString() { 
     return new String ("I am a Copper card"); 
    } 
} 

public class Silver extends Card{ 

    int value; 
    public Silver(int price, int value) { 
     super(price); 
     this.value = value; 
    } 
    public int getValue() { 
     return value; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public String toString() { 
     return new String ("I am a Silver card"); 
    } 
} 

import java.util.ArrayList; 
public class Start { 

    public static void main (String[] args) 
    { 
     Card Card1 = new Copper(0,1); 
     Card Card2 = new Copper(0,1); 
     Card Card3 = new Silver(3,2); 
     ArrayList<Card> hand = new ArrayList<Card>(); 
     hand.add(Card1); 
     hand.add(Card2); 
     hand.add(Card3); 
     System.out.println(hand.get(0)); 
     System.out.println(hand.get(0).getClass()); // --> OK 
     System.out.println(hand.get(0).getPrice()); // --> OK 
     System.out.println(hand.get(0).getValue()); // --> NOT OK     
    } 
} 
+3

Ihre 'Card' Klasse hat keine' getValue() 'Methode - was erwarten Sie von ihr? Es hört sich so an, als würde 'Card' wahrscheinlich abstrakt sein und eine abstrakte Methode' getValue() 'deklarieren (oder die Funktionalität in' Card' selbst setzen). –

+0

danke. Jedoch mit getClass() gibt es Copper und nicht Card zurück. – Bart

+0

Ja, weil das den Typ des Objekts erhält, auf dem Sie es * zur Laufzeit * aufrufen. Es ist sehr wichtig, den Unterschied zwischen Kompilierzeittyp und Laufzeittyp zu verstehen. –

Antwort

3
System.out.println(hand.get(0).getValue()); // --> NOT OK 

, weil Sie die Liste erklärt: ArrayList<Card> hand, so dass alle Elemente sind Card Typ, aber Sie nicht getValue() Methode in Ihrer Card Klasse haben.

Sie können die getValue() in Ihrer Superklasse (Card) erstellen und Unterklassen überschreiben lassen, wenn Ihre Unterklasse etwas Besonderes mit dieser Methode tun muss.

+0

danke. Jedoch mit getClass() gibt es Kupfer und nicht Card .. – Bart

+0

@Bart ist es korrekt, weil getClass() die Laufzeitklasse des Objekts zurückgibt. lies die API und teste etwas. – Kent

Verwandte Themen