2013-05-23 2 views
-2

У меня есть небольшой вопрос о наследовании Java. Поэтому скажите, что у меня есть следующие классы.Вызов функции over-riding в родительском классе

class ScreenObject { 
    public void update(GameContainer gc, StateBasedGame sbg, int delta) { 
     Input input = gc.getInput(); 
     int mouseX = input.getMouseX(); 
     int mouseY = input.getMouseY(); 
     boolean mouseClick = input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON); 
     if (detectMouseClick(mouseX, mouseY, mouseClick)) { 
     this.performClick(gc,sbg,delta); 
     } 
    } 


    public void performClick(GameContainer gc, StateBasedGame sbg, int delta) { 
    } 
} 

class CrewMember extends ScreenObject { 
public void update(GameContainer gc, StateBasedGame sbg, int delta) { 
    super.update(gc, sbg, delta); 
    } 

    public void performClick(GameContainer gc, StateBasedGame sbg, int delta) { 
     System.out.println("hi"); 
    } 
} 

Теперь, когда crewMember.update() вызывается с правильными аргументами, не выход, когда должно быть «привет».

+1

Просьба привести несколько контекстов. Вы имеете в виду Foo или Bar? –

+4

Вы на самом деле ** попробовали ** это? В Java все методы являются виртуальными, поэтому 'Bar.g()' фактически называет 'Bar.f()'. –

+0

Спасибо за все ваши ответы. Я пробовал это, но, вероятно, есть ошибка, которую я пропустил. Я попытался найти его, но нашел ссылки на вызов суперфункции, поэтому я понял, что это необычно. Но я думаю, это действительно наоборот. – user2350018

ответ

3

Если у вас есть панель, то при вызове f() на ней, даже если вы вызываете ее из кода Foo, вы получаете значение f. Там нет выбора, если он переопределен вы получите перекрытый один, поэтому вызов

new Bar().g(); 

приведет «до свидания» получать на консоль.

Переопределение методов, называемых суперклассами, является хорошим способом расширения функциональности класса, где вы знаете, что класс должен всегда что-то делать, но детали могут меняться в каждом подклассе. Обычно делается абстрактным методом суперкласса, поэтому подклассы должны его реализовать, но если есть разумное значение по умолчанию, вы можете добавить это к суперклассу.

1

Просто добавив пример, чтобы помочь OP понять описание @ Натан Юза:

Foo one = new Foo(); 
one.f(); // Foo.f() is called 

Foo two = new Bar(); 
two.f(); // Bar.f() is called 

Bar three = new Bar(); 
three.f(); // Bar.f() is called 
1

В Java, все не статические методы «виртуальные». Это означает, что любой вызов f() будет использовать переопределенную версию текущего экземпляра. Вы можете вызвать метод суперкласса, используя super.f();, но вы не можете позвонить вниз в подкласс.

Это означает, что код

public void g() { 
    f(); 
} 

является:. «Вызывается метод f() из текущего экземпляра Если текущий экземпляр, если тип Bar, это будет вызывать функцию Bar.f()

.

Это не относится к функциям static (за исключением того, что вы, вероятно, столкнетесь с проблемами компиляции из-за циклических зависимостей).

Если вы сделаете ваши методы static, третий класс может фактически назвать:

Foo.f(); 
Bar.f(); 

Обратите внимание, что нет ни одного случая здесь, но эти методы класса.

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