2016-05-25 36 views
1

Ich möchte die Super-Methode einer geerbten Klasse ändern. Ich habe etwas in der Art:Change vererbte Super-Methode

class A { 
    public void method() { 
     // Do something here 
     ... 
    } 
} 

class B extends A { 
    @Override 
    public void method() { 
     // Do something here 
     ... 
     super.method(); 
    } 
} 

class C extends B { 
    @Override 
    public void method() { 
     if(useB()) { 
      // Use B's method 
      super.method(); 
     } else { 
      // Use A's method 
      super.super.method(); 
     } 
    } 
} 

Wie Sie sehen können, muss ich manchmal A's Methode und manchmal die B's verwenden. Wie soll ich das dann machen?

+5

Ich denke, die kurze Antwort wäre: Sie sollten nicht. Sie sollten über Ihre Struktur nachdenken und versuchen, dies ohne die a -> b -> c Struktur zu lösen. Denke über dein Design nach und warum dies passiert ist. Die Tatsache, dass dieses "Problem" hier ist, wird als "Code-Geruch" bezeichnet und bedeutet, dass etwas wahrscheinlich ausgeschaltet ist – Nanne

Antwort

0

eine Konservierungsmethode in Ihrem B.java

class A { 

    public void method() { 
     // Do something here 
     ... 
    } 
} 

class B extends A { 

    public void preserveMethodA(){ 
     super.method(); 
    } 

    @Override 
    public void method() { 
     // Do something here 
     ... 
     preserveMethodA() 
    } 

} 

class C extends B { 

    @Override 
    public void method() { 
     if(useB()) { 
      // Use B's method 
      super.method(); 
     } else { 
      // Use A's method 
      super.preserveMethodA() 
     } 
    } 

} 
0

hinzufügen Es ist nicht richtig, aber man kann immer Flag hinzuzufügen. Wenn das Flag wahr ist, wird die B-Methode aufgerufen, und wenn sie falsch ist, wird eine Methode aufgerufen.

class A { 
    public void method(boolean flag) { 
     // Do something here, ignore flag 
    } 
} 

class B extends A { 
    @Override 
    public void method(boolean flag) { 
     if (flag) { 
      //do something 
     } else { 
      super.method(); 
     } 
    } 
} 

class C extends B { 
    @Override 
    public void method(boolean flag) { 
     super.method(useB()); 
    } 
} 
0

die Bedingung if (useB()) außerhalb C.method() Bewegen und upCast die Instanz von C entweder A oder B auf dem Ergebnis der useB() abhängig und rufen auf der method() upcasted Instanz.