【问题标题】:Exposing a Builder Class to client code向客户端代码公开 Builder 类
【发布时间】:2010-03-05 11:21:31
【问题描述】:

我正在将我的游戏移动到自己的包中,以使其在未来的游戏中有用。 我按照这里的一位用户的建议实现了一个 Builders 类:Interfaces, static classes problem

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 不工作。只有Builder接口的build()方法可用。

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();
}

【问题讨论】:

    标签: java


    【解决方案1】:

    问题是你的builder是这样的

    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 {
        ...
        }
    }
    

    【讨论】:

    • 当我做 Builder 我得到一个语法错误。我已经把这个接口放在我的 Sprite 接口中
    • 我得到了这个工作,但我必须像这样声明 SpriteBuilder extends Builder
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2020-12-17
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多