2015-01-29 5 views
1

Итак, я делаю игру в java, и у меня есть объекты со всеми двумя методами; update() и render().Полиморфизм Java - как вызвать тот же метод в разных классах

В моем основном классе, где находится игровой цикл, мне нужно вызвать методы update() и render() для каждого объекта, который является обновляемым и визуализируемым.
Есть ли способ настроить какой-либо интерфейс, где я могу вызвать методы один раз, и он будет вызывать его во всех реализованных объектах?

+1

Да. Это называется «интерфейсом» или «абстрактным классом», если вы хотите реализовать по умолчанию. Или два 'интерфейса' с методом 'default', если вы используете Java 8. – Mena

+0

Для пояснения: хотите ли вы сделать один вызов метода, который будет вызывать' # update' для каждого экземпляра объекта класса который реализует этот интерфейс? – Morgen

+0

Да, это именно то, чего я пытаюсь достичь. Единственная проблема, которую я вижу до сих пор с другими ответами, заключается в том, что если бы я сказал, создайте класс под названием «Мир» и еще один класс под названием «Player», оба из которых я хочу иметь update() и render() методы. Если бы я создал объекты «Player» в объекте «Мир», а затем в моем основном классе «Игра» я создал объект «Мир», как бы я обновил объекты «Player» из класса «Игра» двумя простой вызов метода чего-то типа objects.update() и objects.render()? –

ответ

1

Другие ответы правильны, однако было бы гораздо лучше использовать composite pattern:

public interface GameComponent { 

    void render(); 

    void update(); 
} 

public abstract class ChildComponent implements GameComponent { 

    protected ContainerComponent parent; // (see below) 

    // getter and setter for parent 
} 

public class ContainerComponent implements GameComponent { 

    protected List<GameComponent> children = new ArrayList<>(); 

    public void add(GameComponent child) { 
     this.children.add(child); 
     child.setParent(this); 
    } 

    @Override 
    public void update() { 
     for (GameComponent c : this.children) { 
      c.update(); 
     } 
    } 

    @Override 
    public void render() { 
     for (GameComponent c : this.children) { 
      c.render(); 
     } 
    } 

} 

Тогда вы реализуете ваши конкретные GameComponent сек, так что они проходят либо ChildComponent или ContainerCompoenent:

public class Player extends ChildComponent { 

    @Override 
    public void update() { 
     // update player 
    } 

    @Override 
    public void render() { 
     // render player 
    } 

} 

public class World extends ContainerComponent { 

    @Override 
    public void update() { 
     super.update(); // update world's children (the player) 
     // update the world (this can be done either after or before updating children, 
     // you choose how to update your world) 
    } 

    @Override 
    public void render() { 
     super.render(); // render world's children (the player) 
     // render the world (this can be done either after or before rendering children, 
     // you choose how to render your world) 
    } 

} 

Затем в главном цикле:

// Create player and world 
Player p = new Player(); 
World w = new World(); 

// Add player to world 
w.add(p); 

// Update everything 
w.update(); 

// Render everything 
w.render(); 

Таким образом, вы создаете композит от GameComponent s, а затем вы update() и render() только верхний уровень ContainerComponent.

+0

Большое вам спасибо! Это потрясающе. Я сделаю дальнейшее исследование этого для лучшего понимания :) –

+0

Добро пожаловать! Удачи! –

0

Это интерфейс предназначены для:

interface I { 
    void render(); 
} 

class A implements I { 
    public void render() { 
     // render an A object ... 
    } 
} 

class B implements I { 
    public void render() { 
     // render an B object ... 
    } 
} 

и в любом месте вы можете иметь

List<I> list = new ArrayList(); 
list.add(new A()); 
list.add(new B()); 

for(I i:list) { 
    i.render(); 
} 

объектов класса А и В Diferent, но реализует тот же контракт (интерфейс).

0

Это один из столпов объектно-ориентированного программирования, .

В принципе, вам необходимо определить интерфейс с помощью методов, которые вам нужны. Обратите внимание, что в java методы интерфейса общедоступны по умолчанию.

public interface Renderable { 
    void render(); 
    void update(); 
} 

И затем вы определяете реализацию. Чтобы реализовать интерфейс, вам нужно использовать ключевое слово «реализует». В приведенном ниже пример, вы увидите «реализует визуализируемый»

public class MyRenderable implements Renderable { 
    public void render() { 
    ... // method impl 
    } 

    public void update() { 
    ... // method impl 
    } 
} 

И, наконец, вы создаете экземпляр и вызов методов через интерфейс.

Renderable r = new MyRenderable(); 
r.render(); 
r.update(); 

Здесь вы можете заполнить список, тип которого соответствует вашему интерфейсу. Вы можете перебирать этот список, вызывая методы из интерфейса, вызывая реализации.

+0

Хорошо, но что, если бы я сделал еще один класс под названием MySecondRenderable, который также реализовал Renderable, и в классе MyRenderable я создал объект MySecondRenderable. Как мне вызвать методы render() и update() для объекта MySecondRenderable, откуда я инициализировал Renderable r = new MyRenderable()? –

+0

@Phil Пожалуйста, см. Мой ответ, который отвечает именно на то, что вы просите здесь. –

0

Одним из основных направлений использования интерфейса является достижение полиморфизма, или способности выполнять ту же операцию по ряду различных объектов. Если разные объекты реализуют один и тот же интерфейс и имеют один и тот же метод, вы можете хранить все эти объекты в Vector/List, например, и итерации через Vector, вызывающие этот метод для каждого из них.

В соответствии с вашими требованиями:

interface I { 
    void render(); 
    void update(); 
    } 

class first implements I { 
    public void update(){ 
     // doWhaterver you want to do 
    } 
    public void render() { 
     // doWhaterver you want to do 
    } 
} 

class second implements I { 
    public void update(){ 
     // doWhaterver you want to do 
    } 
    public void render() { 
     // doWhaterver you want to do 
    } 
} 

Теперь добавьте их в список

List<I> list = new ArrayList(); 
list.add(new first()); 
list.add(new second()); 

for(I i:list) { 
    i.update(); 
    i.render(); 
} 

он будет вызывать введенную функцию, тот называется полиморфизм

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