Java: основной вопрос ООП - PullRequest
       10

Java: основной вопрос ООП

1 голос
/ 05 февраля 2009

Я написал программу как с расширенным режимом, так и с режимом начинающего, чтобы пользователь мог освоить мою программу до того, как она будет фактически использована. Расширенный режим практически идентичен режиму «Начинающий», за исключением того, что один или два метода необходимо заменить другим, поэтому я решил создать общий класс «Режим» для использования в классах «Расширенный режим» и «Режим начинающего» вместо простого копирования кода: здесь является структура класса, если мое объяснение не очень ясно:

  • Класс GUI
  • Класс общего режима
    • Режим начинающего
    • Расширенный режим

Скажем, класс General Mode имеет следующий код:

public class GeneralMode {

    private int range;
    private String id;


    public GeneralMode() {

    }

    public int getRange() {
        return range;
    }

    public String getID() {
    return id;
    }

    public void doStuff() {

    }

}

Класс GeneralMode - это место, где вся работа выполняется для программы. Теперь я хотел бы сделать так, чтобы класс Advanced Mode мог принимать входные данные из класса GUI и использовать его так же, как это делает класс GeneralMode.

Спасибо за вашу помощь!

Ответы [ 5 ]

8 голосов
/ 05 февраля 2009

Создание класса GeneralMode, абстрактного класса, с абстрактными методами, которые должны быть реализованы конкретными классами 'advanced' и 'beginner'. Функциональность, которую имеют оба режима, может быть реализована в классе 'GeneralMode'.

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

псевдокод:

GeneralMode mode = (UseAdvancedMode == true)? new AdvancedMode() : new BeginnerMode();
3 голосов
/ 05 февраля 2009

превращение GeneralMode в абстрактный класс определенно является способом, позволяющим разобраться в полиморфном поведении (как правильно объяснил Фредерик Гейселс).

еще одна важная парадигма ОО -

отдавайте предпочтение композиции, а не наследованию ( Пункт 14, «Эффективная Java» Джоша Блоха )

если ваш маркированный список представляет вашу текущую иерархию наследования (игнорируйте мой комментарий, если нет ...), я настоятельно рекомендую вам изменить его так, чтобы ваш GUI Class был , состоящий из режим (а не режим, являющийся его расширением - классический "это" против "имеет" вопрос). извлечение любых настроек графического интерфейса пользователя в объект параметров, которые вы затем передадите режимам для выполнения своей работы, еще больше уменьшит связь.

2 голосов
/ 05 февраля 2009

Просто чтобы добавить ответ Фредерика, GeneralMode также может быть интерфейсом с BeginnerMode и AdvancedMode, реализующим этот интерфейс.

Используйте абстрактный класс, если вы хотите использовать логику для всех подклассов, если все классы будут иметь одинаковую реализацию getId и любые другие методы, которые будут одинаковыми.

Если вы хотите оставить реализацию этих методов до класса реализации, используйте интерфейс.

1 голос
/ 05 февраля 2009

Другая возможность - использовать шаблон стратегии. Я бы предпочел это в вашем случае, потому что я вижу больше гибкости, например при смене режима во время работы. В этом случае вам не нужно изменять весь экземпляр модели (объект-режим), а только его поведение при загрузке другой стратегии. Таким образом, вы не потеряете состояние своего контекста при переключении режима.

public class GeneralContext //was GeneralMode in your Code-Example
{
 ...
 public void doStuff()
 {
   myMode.doStuff()
 }

 public void changeStrategy(int mode)
 {
   switch(mode)
   {
      case EXPERT_MODE: myMode= new ExpertMode(); break;
       ....    
      default: throw NoSuchMode();
   }
 }

  ....
 private interface Mode
 {
   void doStuff();
 }

 private class ExpertMode implements Mode
 {
   void doStuff()
   {
     ....
   }
 }
 private class BeginnerMode implements Mode
 {
   void doStuff()
   {
     ....
   }
 }

}

Дополнительная информация: GoF-Book ( см. Википедию ), страницы 315 и далее.

0 голосов
/ 05 февраля 2009

Ты на правильном пути. Вам просто нужно изменить метод doStuff(), чтобы получить необходимые входные параметры из графического интерфейса. Затем графический интерфейс может вызвать этот метод для объекта mode, который у него есть, и передать ему соответствующие параметры.

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