Создание образа: наследование, отдельные классы или другое? - PullRequest
0 голосов
/ 16 февраля 2012

Я разрабатываю приложение в JAVA SE с базой данных в SQL Server.

В этом приложении у меня будет три вида изображений:

  • Символы первой помощи
  • Символы опасности
  • Символы EPI

Все изображения имеют следующие атрибуты:

  • imageID - int
  • imageDescription - String
  • image - ImageIcon

Таким образом, изображения Fist Aid и EPI нуждаются в этом атрибуте:

  • isUsedInRiskAssessment - boolean

Мой вопрос: каков наилучший подход для реализации этой структуры?

Наследование: (изображение в ссылке)

http://img194.imageshack.us/img194/6871/inheritance.png

Я знаю, что наследование часто называют «злым», но в этом случае оно кажется допустимым, за исключением наличия подкласса без каких-либо других атрибутов.

Отдельные классы: http://img580.imageshack.us/img580/511/separated.png

Или другое?

На моем бизнес-уровне я хочу иметь возможность возвращать все изображения (независимо от типа) в графический интерфейс.Я также пытался иметь класс Image и другой класс под названием ImageType.Но в этом сценарии Image, когда ImageType равен Символы опасности , будет иметь неиспользуемый атрибут - isUsedInRiskAssessment.

Это также влияет на то, как я 'Я собираюсь создать таблицы в базе данных.

Надеюсь, я все объяснил.Спасибо.

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

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

class Image {
    private int imageId;
    private String imageDescription;
    private ImageIcon image;

    ...
}

// I can't come up with a proper name right now
class ImageChild extends Image { 
    private boolean isUsedInRiskAssessment;

    ...
}

Image firstAidImage = new ImageChild();
Image epiImage = new ImageChild();
Image dangerImage = new Image();

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

0 голосов
/ 16 февраля 2012

Наследование здесь неплохое. Но иногда бывает необходимо написать код, который определит реальный тип, и выполнить приведение типов - вам не понравится код, который вы получите. Вот почему я бы предложил иметь иногда неиспользуемое свойство Boolean. На самом деле, три значения: true, false и null - это то, что вам нужно. Но убедитесь, что вы упомянули значение null в вашей документации.

0 голосов
/ 16 февраля 2012

Я бы создал класс AbstractImage, который реализует интерфейс IImage. Для объявления полей используется только интерфейс. Я бы создал один расширенный класс для FirstAidImage и EPIImage. Если вам действительно нужно различать оба, используйте перечисление ImageType, но не реализуйте разные классы, которые в точности совпадают. Для DangerImage создайте класс, который расширяет AbstractImage и предоставляет дополнительный атрибут.

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