接口,静态类问题

时间:2010-03-04 03:20:17

标签: java

我目前正在将我的所有游戏代码移动到另一个包中,这样我就可以在创建另一个类似的游戏时重复使用它。

我遇到了一些问题。

public interface Sprite {
...
}

abstract class AbstractSprite implements Sprite {
...
}

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

class GameObjectImpl extends AbstractSprite {
    public static class GameObjectBuilder implements Builder<GameObjectImpl> {
    ...
    }
}

我正在使用Builder Pattern来创建我的GameObjectImpl对象。但是,客户端(使用我的游戏引擎的人)只能访问Sprite界面。

如何让客户端使用构建器创建GameObjectImpl并且只能访问Sprite接口?

3 个答案:

答案 0 :(得分:2)

您可以在名为Builders的同一个包中添加一个公开可见的类:

public final class Builders {

    public static Builder<? extends Sprite> newGameObjectBuilder() {
        return new GameObjectImpl.GameObjectBuilder();
    }

}

答案 1 :(得分:0)

为什么Builder需要成为一个界面?为什么不做一个类似建筑商的工厂呢?您似乎希望将接口与此特定实现联系起来。

public final class SpriteBuilder {
  private final Foo foo;
  private int property = 0;

  public SpriteBuilder(Foo importantMandatoryValue) {
    this.foo = importantMandatoryValue;
  }

  public SpriteBuilder setProperty(int theProperty) {
    this.property = property;
    return this;
  }

  public Sprite build() {
    return new GameObjectImpl(foo, property);
  }
}

您可以致电SpriteBuilder GameObjectImplFactory ...并为每个Sprite实施制作类似的课程。您只需确保它们只返回Sprite类型。

在您的示例中,您实际上会说public class GameObjectImplFactory implements Builder<Sprite>

希望这有用并且有意义: - )。

答案 2 :(得分:0)

我认为你不想让Builder类通用...而Builder.build()应该返回一个Sprite对象。现在build()方法正在返回T,在您的情况下是GameObjectImpl