ограничить экземпляр объекта, чтобы соответствовать определенным параметрам - PullRequest
1 голос
/ 30 января 2012

Скажем, у меня есть питомец класса, и он состоит из двух переменных:

Class Pet {
Category category; // be amphibian, fish, mammal, dog
Diet diet; //meat, vegetarian, omnivore
...

Если категория = собака, я хочу ограничить диету только всеядным животным (и наоборот). Моя настоящая проблема несколько сложнее, как лучше всего это кодировать? Я начал с вложенных перечислений, а затем с классом внутреннего строителя ...

Является ли это обычным делом, которое я могу использовать?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

У вас есть эта проблема, потому что вы не пользуетесь здесь наследством. Dog ЕСТЬ Pet. Так что пусть Dog extend Pet. Pet будет иметь реферат setDiet(), а Dog будет реализовывать это с применением правил диеты, применимых к собаке .

class Pet
{
  Diet diet;

  abstract boolean satisfiesDietRules();

  public Pet()
  {
    if(!satisfiesDietRules())
    {
      throw CannotCreatePetException();
    }
  }
}

class Dog extends Pet
{
  boolean satisfiesDietRules()
  {
    //rules
  }
}

Теперь вы можете инкапсулировать правила диеты в соответствующие им enum (ваш текущий подход) или использовать естественное наследование. Если вы используете композиционный подход, то вы не можете использовать полиморфизм. Так что зависит от ваших бизнес-требований, чтобы понять, какой из них использовать. Если вы убедитесь, что не нарушаете LSV, тогда наследование кажется естественным решением для этого.

2 голосов
/ 30 января 2012

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

Это предполагает, что эти атрибуты являются неизменными (как они, кажется, из контекста). Если это не так, установщики для diet и т. Д. Также должны будут применять ограничения.

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