Voglio estendere la classe Base che è definita in API specifiche e estendere di nuovo l'estensione. Come puoi vedere qui sotto, il metodo draw della classe intermedia calcola la variabile top e ho bisogno di usarlo nella seconda sottoclasse:
abstract class Base{
public abstract void draw();
}
class Sub1 extends Base{
@Override
public void draw() {
//calculate top
int top = 10;
//use "top"
}
}
class Sub11 extends Sub1{
@Override
public void draw() {
super.draw();
//how to use "top" of "super.draw"?
}
}
Penso ci siano alcune opzioni:
- ricalcolo
topindraw()diSub11ma penso che violiDRY - estraendo
topcome campo:
class Sub1 extends Base{
private int top;
public int getTop() {
return top;
}
@Override
public void draw() {
int top = 10;
this.top = top;
}
}
class Sub11 extends Sub1{
@Override
public void draw() {
super.draw();
//use "top" of "super.draw"
int top = getTop();
}
private void method(){
//use "super.top" without executing "super.draw"
int top = getTop();
}
}
Sembra che il secondo sia migliore, ma rende top accessibile in altri posti di Sub11 senza eseguire super.draw() e questo può causare bug. Anche commentare top con alcune cose come Do not use before calling "draw()" non può limitare l'utilizzo errato degli utenti prima di chiamare draw() . C'è un modo per rimuovere la capacità dell'utente di sbagliare erroneamente?
Modifica
-
topinSub1eSub11ha lo stesso motivo per essere calcolato - Posso creare un
compositeinvece di estendereSub1inSub11, ma prima devo estendereBasein un'altra classe (Sub2) e poi usareSub1eSub2in composito. È una buona pratica? - Non è possibile calcolare
topsudraw(), perché è necessario calcolare gli argomenti di input didraw()edraw()può chiamare più volte con argomenti diversi.