Elaborazione e invio di dati elaborati a super dal costruttore di classi child

1

Voglio fare un'inizializzazione nel costruttore di classi child e passare il risultato a super() .

Ma Java non consente alcuna elaborazione nel costruttore di classi child prima della chiamata super() .

Qual è un buon modo per risolvere questo problema?

    
posta sameer 04.08.2016 - 10:52
fonte

2 risposte

0

La cattiva notizia è che non puoi.

La buona notizia è che puoi.

Come non puoi:

  • B estende A
  • B è un A
  • solo un'istanza B può essere costruita su un'istanza A esistente
  • Non puoi creare un'istanza di B, e tanto meno cambiare lo stato, prima di creare un'istanza di A
  • Ricorda inoltre che, dopo aver chiamato super (), qualsiasi modifica apportata allo stato della superclasse viene eseguita nella sottoclasse, a meno che tu non stia nascondendo i membri, ovvero dichiarando un membro o un campo nella sottoclasse con lo stesso nome di una delle superclasse quando il membro della superclasse è visibile nella sottoclasse.

Come puoi:

Per risolvere questa situazione, non usare l'ereditarietà, usa la composizione. Ma ricorda che sia A sia B non dovrebbero dipendere l'uno dall'altro. Entrambi dovrebbero dipendere da un'astrazione (ad esempio un'interfaccia) che entrambi (o forse solo A) implementano.

In senso stretto non si tratta di composizione ma di aggregazione ma, in un modo di parlare lento, stiamo usando composizione invece dell'ereditarietà .

==>I.java<==

publicinterfaceI{publicvoidsetChild(Ii);publicvoidsetParent(Ii);publicvoidsetX(Strings);publicvoidsetY(intn);publicvoidsetZ(booleanb);}

==>A.java<==

/*ThisclassisabstractonlyforEclipsetoallowmetoleaveoutallthemethodstubsforthesakeofconcisenessoftheexample(Ilikemyexamplestocompile)*/publicabstractclassAimplementsI{privateIchild;@OverridepublicvoidsetChild(Ii){this.child=i;this.child.setParent(this);}}

==>B.java<==

/*ThisclassisabstractonlyforEclipsetoallowmetoleaveoutallthemethodstubsforthesakeofconcisenessoftheexample(Ilikemyexamplestocompile)*/publicabstractclassBimplementsI{privateIparent;@OverridepublicvoidsetParent(Ii){this.parent=i;//nowmodifythestateofthe"parent"
        this.parent.setX("Answer to the Ultimate Question of Life, The Universe, and Everything");
        this.parent.setY(42);
        this.parent.setZ(true);
    }

}
    
risposta data 03.09.2016 - 20:35
fonte
0

Preferirei la composizione sull'ereditarietà e fare qualcosa del tipo:

public class Super(Child child) {
}

(nome per coerenza con la domanda sopra - non va bene altrimenti) e iniettare dipendenza della classe in. Affidarsi all'ordine di costruzione in una gerarchia di eredità è difficile, problematico e non consente una successiva decomposizione / disallanglement delle classi dipendenti.

Non appena mi trovo in una situazione del genere, faccio un passo indietro e chiedo cosa cerco davvero di raggiungere. Il risultato (in genere) è simile a quanto sopra.

    
risposta data 04.08.2016 - 14:18
fonte