Интерфейсы, проблема статических классов - PullRequest
3 голосов
/ 04 марта 2010

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

Хотя у меня есть некоторые проблемы с этим.

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

Я использую Pattern Builder для создания моих объектов GameObjectImpl. Однако клиент (человек, использующий мой игровой движок) будет иметь доступ только к интерфейсу Sprite.

Как я могу заставить клиента создавать GameObjectImpl с помощью компоновщика и иметь доступ только к интерфейсу Sprite?

Ответы [ 3 ]

2 голосов
/ 04 марта 2010

Вы можете добавить еще один публично видимый класс в том же пакете под названием Builders:

public final class Builders {

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

}
0 голосов
/ 04 марта 2010

Не думаю, что вы захотите сделать класс Builder универсальным ... вместо этого Builder.build() должен возвращать объект Sprite. Прямо сейчас метод build() возвращает T, который в вашем случае является GameObjectImpl

0 голосов
/ 04 марта 2010

Почему 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 a GameObjectImplFactory ... и создать аналогичный класс для каждой из ваших Sprite реализаций. Вам просто нужно убедиться, что они вернут только тип Sprite.

В вашем примере вы бы сказали что-то вроде public class GameObjectImplFactory implements Builder<Sprite>.

Надеюсь, что это помогает и имеет смысл: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...