Как обрабатывать статические поля, которые варьируются в зависимости от реализации класса - PullRequest
4 голосов
/ 16 сентября 2008

Я постоянно сталкиваюсь с этой проблемой. Предположим, я делаю интерфейс командной строки (Java или C #, проблема та же, я думаю, я покажу C # здесь).

  1. Я определяю интерфейс ICommand
  2. Я создаю абстрактный базовый класс CommandBase, который реализует ICommand, чтобы содержать общий код.
  3. Я создаю несколько классов реализации, каждый из которых расширяет базовый класс (и за счет расширения интерфейса).

Теперь - предположим, что интерфейс указывает, что все команды реализуют свойство Name и метод Execute ...

Для Name каждый из моих экземпляров классов должен возвращать строку, которая является именем этой команды. Эта строка («HELP», «PRINT» и т. Д.) Является статической для соответствующего класса. То, что я хотел бы сделать, это определить:

публичная абстрактная статическая константная строка Name;

Однако (к сожалению) вы не можете определить статические элементы в интерфейсе.

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


UPDATE:

  1. Я не могу заставить форматирование кода работать должным образом (Safari / Mac?). Извинения.
  2. Пример, который я использую, тривиален. В реальной жизни иногда существуют десятки реализующих классов и несколько полей этого полустатического типа (т. Е. Статических для реализующего класса).

  3. Я забыл упомянуть - в идеале я хочу иметь возможность запрашивать эту информацию статически:

    имя строки = CommandHelp.Name;

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

Ответы [ 11 ]

0 голосов
/ 16 сентября 2008

[Предлагаемое решение № 1 из 3]

  1. Определите абстрактное свойство Name в интерфейсе, чтобы заставить все реализующие классы реализовать свойство name.
  2. (в c #) Добавьте это свойство как абстрактный в базовый класс.
  3. В реализациях реализуем так:

    public string Name 
    {
      get {return COMMAND_NAME;}
    }
    

    Где имя - это константа, определенная в этом классе.

    Преимущества:

    • Само имя определяется как константа.
    • Интерфейс требует создания свойства.

    Недостатки:

    • Дублирование (которое я ненавижу). Точно такой же код доступа к свойству, вставленный в каждую из моих реализаций. Почему нельзя перейти в базовый класс, чтобы избежать беспорядка?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...