2016-05-20 16 views
0

У меня есть базовый класс под названием GameEngine, который должен быть «ядром» моего «игрового движка». Он выполняет все графические обработки и физику. Тем не менее, я не хочу ставить свой исходный код для игры в этом классе. Так что это в основном то, что у меня есть:Java - метод вызова в подклассе («код пользователя» перед методом заканчивания)?

//GameEngine 
void start() { 
    //While loop to call render() and tick() 
} 
void render() { 
    //BufferStrategy, etc. 
    //[[[[HERE]]]] Call method on subclass 
    //dispose() and show() 
} 
void tick() { } 

и ...

//SampleGame 
public class SampleGame extends GameEngine { 
    public static void main(String[] args) { 
     new GameEngine().start(); 
    } 
    public void render() { 
     //This gets called before dispose() and show() 
    } 

} 

Итак, как я могу получить метод визуализации(), вызываемого подкласс суперкласса? Я не могу переопределить метод суперкласса, потому что ему нужно выполнить некоторую работу до и после вызова метода подкласса().

Спасибо

+0

Почему это подкласс вообще? Есть ли другой код, который у них есть? Вы не сможете вызвать метод подкласса, не делая экземпляр его в суперклассе. – Zircon

+0

Вам не хватает базового понимания ООП, наследования и классов. Вы должны * вероятно * изучить – Amit

+0

Я думал, что сначала написал ответ, но эта ссылка на Wiki отлично отвечает на ваш вопрос: https://en.wikipedia.org/wiki/Template_method_pattern#Example_in_Java –

ответ

3

Declare render() как abstract метода суперкласса, который он вызывает в соответствующей точке. Затем подкласс определяет поведение этого метода, переопределяя его конкретной реализацией.

1

Я бы использовал шаблон дизайна шаблонов слотов. Короче говоря, у вас есть конечная последовательность шагов алоризма, но нужно разрешить параметризацию на определенных этапах. Эти конкретные шаги - это то, где будут вызываться методы «слотов». Как правило, методы слота являются защищенными (абстрактными) методами с префиксом doXXX().

Пример:

//GameEngine 
void start() { 
    //While loop to call render() and tick() 
} 
void render() { 
    //BufferStrategy, etc. 
    doCallUserCode(); 
    //dispose() and show() 
} 
void tick() { } 
protected abstract doCallUserCode();