2016-06-02 4 views
-3

Ich fühle mich wie ich die computeResults() Methoden aus den Unterklassen auf die Eltern verschieben sollte, da sie identisch sind, aber wenn ich Eclipse warnt auf die Eltern, The method computeField3() and computeField4() are undefined for the type Parent Vielleicht verstehe ich Vererbung nicht vollständig.
Ich kann die Klassen kompilieren, wie ich es unten habe, aber dann folgen meine Unterklassen nicht dem Prinzipal Do not Repeat Yourself? Oder sind meine Klassen richtig definiert?Java Subclasses haben eine repeative Methode

public class Parent { 
    private BigDecimal field1; 
    private BigDecimal field2; 
    protected BigDecimal field3; 
    protected BigDecimal field4; 

    protected void computeField1() { 
    // math equation identical b/n all subclasses 
    setField1(value); 
    } 
    protected void computeField2() { 
    // math equation identical b/n all subclasses 
    setField2(value); 
    } 
} 

public class Child1 extends Parent { 
    void computeResults() { 
     // This method is redundant and I would like to move to Parent 
     computeField1(); 
     computeField2(); 
     computeField3(); 
     computeField4(); 
    } 


    private void computeField3() { 
    // math equation for Child1 and Child2 differs for field3 
    setField3(value); 
    } 
    private void computeField4() { 
    // math equation for Child1 and Child2 differs for field4 
    setField4(value); 
    } 
} 

public class Child2 extends Parent { 
    void computeResults() { 
     // This method is redundant and I would like to move to Parent 
     computeField1(); 
     computeField2(); 
     computeField3(); 
     computeField4(); 
    } 

    private void computeField3() { 
    // math equation for Child1 and Child2 differs for field3 
    setField3(value); 
    } 
    private void computeField4() { 
    // math equation for Child1 and Child2 differs for field4 
    setField4(value); 
    } 
} 
+0

Mmmh, 'private void computeField4 {' Syntax in seltsame ... Sie sollten 'private void computeField4() {' sonst wird Ihr Programm nicht syntaktisch korrekt sein. Ich denke, Funktionen sollten immer Parens haben, um Parameter anzuzeigen (auch wenn es keinen Parameter gibt). –

+0

@AlexisClarembeau, das war ein Tippfehler, der echten Code in die Frage übersetzt – jeff

+0

aber rufen Sie 'computeField3' und' computeField4' auf einem übergeordneten Objekt oder nur auf Kindobjekt - wenn in Ihrem Code haben Sie so etwas wie: Parent p = new Parent(); p.computeField3() 'dann müssen Sie computeField3 in Parent-Klasse deklarieren, deklarieren Sie es abstrakt, wenn Sie es nicht auf dieser Ebene benötigen –

Antwort

0

Ihr Problem ist, dass, wenn Sie computeResults an die Mutter bewegen, wie sein Code Look machen

public class Parent { 
    private BigDecimal field1; 
    private BigDecimal field2; 
    protected BigDecimal field3; 
    protected BigDecimal field4; 

    void computeResults() { 
    computeField1(); 
    computeField2(); 
    computeField3(); 
    computeField4(); 
    } 
    protected void computeField1() { 
    // math equation identical b/n all subclasses 
    setField1(value); 
    } 
    protected void computeField2() { 
    // math equation identical b/n all subclasses 
    setField2(value); 
    } 
} 

es versucht computeField3/4 nennen sie aber nicht finden, weil sie don‘ t in Ihrem Code für Klasse vorhanden.

Also müssen Sie computeField3/4 zu der Parent Klasse hinzufügen, die die Unterklassen beliebig überschreiben können.

+1

Als eine Anmerkung ist die Standardmethode, dies zu tun, sie abstrakt zu machen, so dass keine Implementierung zur Verfügung gestellt wird die Elternklasse, aber sie müssen in abgeleiteten Klassen implementiert werden. –