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
top
indraw()
diSub11
ma penso che violiDRY
- estraendo
top
come 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
-
top
inSub1
eSub11
ha lo stesso motivo per essere calcolato - Posso creare un
composite
invece di estendereSub1
inSub11
, ma prima devo estendereBase
in un'altra classe (Sub2
) e poi usareSub1
eSub2
in composito. È una buona pratica? - Non è possibile calcolare
top
sudraw()
, perché è necessario calcolare gli argomenti di input didraw()
edraw()
può chiamare più volte con argomenti diversi.