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);
}
}