Chiamando un costruttore da una classe genitore in una classe derivata

2

Sto provando a creare una classe genitore con un costruttore che accetta un singolo int come parametro. Devo anche derivare una classe figlia che crei due istanze della classe genitore usando un costruttore che prende due interi. So di usare la parola chiave "super" per usare il costruttore della classe genitore, ma come posso usare la seconda int nel costruttore di figlio per chiamare lo stesso costruttore genitore? Non posso usare "super" due volte, quindi c'è un altro modo per usare il secondo parametro? So che potrei semplicemente chiamare due volte il costruttore figlio dal metodo principale, ma in particolare ho bisogno di un costruttore figlio che prenda due parametri e crei due oggetti della classe genitore. Grazie.

public class Int 
{   
    public int numberOne;

    public Int(int numberHere)
    {
        numberOne = numberHere;
    }

    //methods...
}   



public class Rational extends Int
{
    Int numerNum;
    Int denomNum;

    public Rational(int oneHere, int twoHere)
    {
        super(oneHere);
    }

    //methods...
}
    
posta benzeneAlanine 28.03.2016 - 23:46
fonte

3 risposte

11

Stai provando a utilizzare eredità quando hai bisogno di usare composition .

Utilizza invece questo come punto di partenza:

public class Rational {

    private Int numerator;
    private Int denominator;

    public Rational(int num, int den) {
        numerator = new Int(num);
        denominator = new Int(den);
    }
}

Come regola generale, l'ereditarietà viene utilizzata al meglio per le relazioni "Is-a". Chiediti: "Un numero razionale è un numero intero?" La risposta è chiaramente no.

    
risposta data 29.03.2016 - 00:07
fonte
2

Per ereditarietà, modelli una relazione "è-a". Rendendo la Rational una sottoclasse di Integer, stai sostanzialmente dicendo che Rational IS A Integer (è vero?).

Inoltre, il costruttore di un oggetto o della sua superclasse viene utilizzato per inizializzare quell'oggetto. Non è possibile utilizzare il costruttore per inizializzare più oggetti.

Ciò che si vuole veramente fare è modellare una relazione "ha-a". A Rational ha 2 numeri interi: un denominatore e un numeratore. Che puoi modellare avendo 2 membri di Int.

    
risposta data 29.03.2016 - 00:08
fonte
2

Il problema è che stai abusando dell'eredità per modellare qualcosa che non è una relazione "è una". Un numero razionale "non è un numero intero". Non sono anche due numeri interi, oltre al fatto che in Java puoi solo derivare esattamente da un class . Al contrario, un numero razionale "ha due" numeri interi: il numeratore e il denominatore. Ci sono segni nel tuo codice che hai già riconosciuto questo, ma non nella misura massima. In breve, rimuovi la relazione di ereditarietà e assegna semplicemente i due membri.

public final class Int {

    private final int value;

    public Int(final int val) {
        this.value = val;
    }

}

public final class Rational {

    private final Int numerator;
    private final Int denominator;

    public Rational(final int numer, final int denom) {
        this.numerator = new Int(numer);
        this.denominator = new Int(demom);
    }

}

In realtà, invece di new 's up degli oggetti Int , preferirei che fossero passati al costruttore.

public final class Rational {

    private final Int numerator;
    private final Int denominator;

    public Rational(final Int numer, final Int denom) {
        this.numerator = numer;
        this.denominator = demom;
    }

}
    
risposta data 29.03.2016 - 00:10
fonte

Leggi altre domande sui tag