Переопределяет метод со всеми родителями, работает в этом методе? - PullRequest
3 голосов
/ 20 июля 2011

У меня есть класс B, который выходит из класса A, класс B переопределяет метод класса A:

public class ClassB extends ClassA {

    @Overrides
    protected void DoSomething() {
        super.DoSomething();
        // Some ClassB code here, called WorkB
    }
}

После этого я создаю объект класса B, и мне нужно сделать что-то дополнительное в дополнение к версии A в DoSomething ():

ClassB objB = new ClassB() {

    @Overrides
    protected void DoSomething() {
        // I need to do something more here
    }

}

Мне нужно знать, могу ли я сделать ВСЕ из ClassA работ, ClassB работ, а затем добавить какой-нибудь другой код для objB в этом методе? У меня есть решение: создайте public method в ClassB, который делает WorkB, затем в objB, просто вызовите метод. Но я хочу знать, есть ли другой способ (неважно, хуже или лучше мое решение!).

РЕДАКТИРОВАТЬ: Я суммирую вопрос, чтобы вы могли легко понять его:

  • Class A '* * * * * * * * * * * *.
  • Class B переопределяет doSomething, вызывает super.doSomething () и некоторый дополнительный код, что означает, что он делает WorksA, и дополнительный, называемый WorksB.
  • Объект objB doSomething() метод должен сделать WorksA, WorksB и еще один дополнительный элемент, называемый WorksBExtra.

Вот и все.

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Да, просто позвоните сначала super.doSomething(), и он будет отбрасывать до класса А, а затем до класса В. После этого вы можете делать определенные вещи.

public class A {
public void doSomething() {
    System.out.println("A, ");
}

}

public class B extends A {
public void doSomething() {
    super.doSomething();
    System.out.println("B, ");
}

}

public static void main(String[] args) {
    B b = new B() {
        @Override
        public void doSomething() {
            super.doSomething();
            System.out.println("new B");
        }
    };
    b.doSomething();
}

Выходы A, B, новые B

2 голосов
/ 20 июля 2011

Ваш объект является экземпляром анонимного подкласса ClassB, и вы можете переопределить его точно таким же образом:

ClassB objB = new ClassB() {

    @Override
    protected void DoSomething() {
        super.DoSomething();
        // do something more here just for this object.
    }

}

Этот код сначала вызовет ClassB версию DoSomething(), котораявызывает версию ClassA.Таким образом, общий эффект состоит в том, чтобы сначала выполнить ClassA, затем ClassB, затем материал, относящийся к анонимному подклассу.

Я думаю, что вы неправильно написали аннотацию.Это @Override без "с".Вероятно, просто опечатка.

Также обратите внимание, что ваш DoSomething() довольно нестандартное наименование.Вам лучше назвать его doSomething() в соответствии с тем, как методы обычно называются в Java.

...