2016-06-02 2 views
-3

Мне кажется, что я должен переместить методы computeResults() из подклассов в родительский, поскольку они идентичны, но когда я делаю Eclipse, предупреждает на родительском компьютере, что The method computeField3() and computeField4() are undefined for the type Parent Возможно, я не полностью понимаю наследование.
Я могу получить классы для компиляции, поскольку у меня есть это ниже, но тогда мои подклассы не следуют принципам Do not Repeat Yourself? Или мои классы правильно определены?Java-подклассы имеют повторяющийся метод

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 {' синтаксис в странном ... Вы должны использовать 'private void computeField4() {' иначе, ваша программа не будет синтаксически корректной. Я думаю, что функции всегда должны иметь параметры для указания параметров (даже если нет параметров). –

+0

@AlexisClarembeau, это был типографский перевод реального кода в вопрос – jeff

+0

, но вы называете 'computeField3' и' computeField4' на родительском объекте или только на дочернем объекте - если в вашем коде есть что-то вроде Parent p = new Parent(); p.computeField3() ', тогда вам нужно объявить computeField3 в классе Parent, объявить его абстрактным, если вам не нужно его на этом уровне –

ответ

0

Ваша проблема в том, что при перемещении computeResults родителю, что делает его похожим на код

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

он пытается вызвать computeField3/4 но не находит их, , потому что они не» t в вашем коде для класса Parent.

Таким образом, вам необходимо добавить computeField3/4 в класс Parent, что подклассы могут переопределять по своему усмотрению.

+1

. В качестве примечания, стандартный способ сделать это - сделать их абстрактными, чтобы реализация не предоставлялась в родительский класс, но они должны быть реализованы в производных классах. –

Смежные вопросы