2017-11-28 2 views
1

ich eine übergeordnete Klasse erstellt, die ich Courrier namensEine Reihe von Kind-Objekten

public class Courrier { 
private double poid; 
private boolean expr; 
String ad; 
private char z ; 
public Courrier(double poid, boolean expr, String ad, char z) { 
    this.poid = poid; 
    this.expr = expr; 
    this.ad = ad; 
    this.z = z; 
} 
public double getPoid() { 
    return poid; 
} 
public boolean isExpr() { 
    return expr; 
} 
public String getAd() { 
    return ad; 
} 
public char getZ() { 
    return z; 
}} 

und zwei Kinder Klassen beide enthält eine Methode namens affranchir() dann eine Klasse dort -Test ist:

public class Test { 
public static void main(String[] args) { 
    Courrier[] T = new Courrier[4]; 
    T[0] = new Lettre(200, true, "London", 'C', "A3"); 
    T[1] = new Colis(3000, false, "Barcelone", 'B', 50); 
    T[2] = new Lettre(500, false, "Béchar", 'A', "A4"); 
    T[3] = new Colis(150, true, "New york", 'C', 175); 
    double tarif=0; 
    for (int i = 0; i < T.length; i++) { 
      System.out.println(T[i].affranchir()); 
      tarif+=T[i].affranchir(); 
    } 
    System.out.println(tarif); 
}} 

gut gibt es ein Problem, es heißt Die Methode affranchir() ist nicht definiert für den Typ Courrier und ich möchte es ohne Gießen machen, gibt es bitte irgendeinen Weg?

+1

Implementieren Sie die Methode in der Basisklasse Courrier (und die untergeordneten Klassen '@ Override' it) - sonst nicht (ich bin nicht Reflexion als besser Zählen Lösung zum Casting) – UnholySheep

+1

Java entscheidet, welche Methode basierend auf dem Referenztyp und nicht auf dem tatsächlichen Typ zugänglich ist. Wenn Sie über Ihre Superklassenreferenz auf die Methode affranchir() zugreifen wollen, muss dieser Typ diese Methode haben. Aber vielleicht brauchst du dein Array nicht wirklich von deiner Oberklasse? Vielleicht können Sie eine separate "Schnittstelle" erstellen, die Methoden enthält, die Sie aufrufen möchten, und dann Ihre Unterklassen diese Schnittstelle implementieren lassen? Auf diese Weise können Sie 'YourInterface []' Array anstelle von 'Courrier []' Array verwenden, das alle Instanzen enthalten kann, die diese Schnittstelle implementieren. – Pshemo

Antwort

0

eine abstrakte Methode hinzufügen

public abstract class Courrier { 

/* code */ 

public abstract void affranchir(); 

/* code */ 

} 
0

Sie haben eine Reihe von übergeordneter Klasse Courrier

Courrier[] T = new Courrier[4]; 

und dann rufen Sie eine Methode der Kinderklasse von diesem Objekt gemacht

T[i].affranchir(); 

Dies ist der einzige Fehler. Anstatt Objekt der Elternklasse zu machen, machen Sie das Objekt der Kindklasse und rufen Sie dann diese Methode auf. Es wird definitiv funktionieren. Danke

+0

ich weiß, aber ich wurde aufgefordert, ein Array der Elternklasse Courrier thnxx – Mafaza

+0

Wenn Sie Array der Elternklasse machen wollen, dann definieren Sie die Methode affranchir() in der Elternklasse selbst. –