Я постоянно сталкиваюсь с этой проблемой. Предположим, я делаю интерфейс командной строки (Java или C #, проблема та же, я думаю, я покажу C # здесь).
- Я определяю интерфейс ICommand
- Я создаю абстрактный базовый класс CommandBase, который реализует ICommand, чтобы содержать общий код.
- Я создаю несколько классов реализации, каждый из которых расширяет базовый класс (и за счет расширения интерфейса).
Теперь - предположим, что интерфейс указывает, что все команды реализуют свойство Name и метод Execute ...
Для Name каждый из моих экземпляров классов должен возвращать строку, которая является именем этой команды. Эта строка («HELP», «PRINT» и т. Д.) Является статической для соответствующего класса. То, что я хотел бы сделать, это определить:
публичная абстрактная статическая константная строка Name;
Однако (к сожалению) вы не можете определить статические элементы в интерфейсе.
Я боролся с этой проблемой уже много лет (практически в любом месте, где у меня есть семья схожих классов) и поэтому опубликую свои 3 возможных решения ниже для ваших голосов. Однако, поскольку ни один из них не идеален, я надеюсь, что кто-то опубликует более изящное решение.
UPDATE:
- Я не могу заставить форматирование кода работать должным образом (Safari / Mac?). Извинения.
Пример, который я использую, тривиален. В реальной жизни иногда существуют десятки реализующих классов и несколько полей этого полустатического типа (т. Е. Статических для реализующего класса).
Я забыл упомянуть - в идеале я хочу иметь возможность запрашивать эту информацию статически:
имя строки = CommandHelp.Name;
2 из моих 3 предложенных решений требуют, чтобы экземпляр класса был создан, прежде чем вы сможете найти эту статическую информацию, которая уродлива.