Предоставление класса Builder клиентскому коду - PullRequest
0 голосов
/ 04 марта 2010

Я перевожу мою Игру в ее собственный пакет, чтобы сделать ее полезной в будущих играх. Я реализовал класс Builders, как предложил один из пользователей здесь: Интерфейсы, проблема статических классов

public final class Builders {
    public static Builder<? extends Sprite> newGameObjectBuilder(Point location, int drawable) {
        return new GameObjectImpl.GameObjectBuilder(location, drawable);
    }
}

Проблема теперь в том, что клиентский код не может использовать методы компоновщика (пример ниже). Я получаю следующее:

"The method onReceiveKey(new Sprite.ReceiveKeys(){}) is undefined for the type Builder<capture#4-of ? extends Sprite>"

В принципе, я не могу использовать ни один из методов внутри публичного статического вызова GameObjectBuilder.

onReceiveKey не работает. Доступен только метод build() интерфейса Builder.

public static Sprite newSoldier(int x, int y) {
    return  Builders.newGameObjectBuilder(new Point(x,y), R.drawable.soldier)
    .onReceiveKey(new Sprite.ReceiveKeys() {

        @Override
        public void onKeyUp(int keyCode, Sprite self, Room room ) {


        }

        @Override
        public void onKeyDown(int keyCode, Sprite self, Room room ) {
            if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                self.moveY(room, 1, Direction.S); 
            }
            else if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
                self.moveY(room, -1, Direction.N); 
            }
            else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
                self.moveX(room, -1,Direction.W); 
            }
            else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
                self.moveX(room, 1, Direction.E);
            }
        }
    })
    .build();
}

1 Ответ

1 голос
/ 04 марта 2010

Дело в том, что ваш строитель такой

public interface Builder<T> {
    public T build();
}

Просто сделай

public interface SpriteBuilder<T extends Sprite> extends Builder<T> {
    Builder<T> onReceiveKey(Sprite.ReceiveKeys receiver);
}

и измените Builders на

public final class Builders {
    public static SpriteBuilder newGameObjectBuilder(Point location, int drawable) {
        return new GameObjectImpl.GameObjectBuilder(location, drawable);
    }
}

и ваши GameObjectBuilder до

class GameObjectImpl extends AbstractSprite {
    public static class GameObjectBuilder implements SpriteBuilder {
    ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...