У меня есть абстрактный класс, который реализует некоторую функцию, скажем, FileFormat
.Для каждого формата файла, который я хочу поддерживать, у меня есть подкласс, такой как ZipFileFormat
или TextFileFormat
.Некоторые функции формата файла с состоянием, такие как операция, чтобы преобразовать файл в поток текста.Но некоторые другие функции не имеют состояния, например расширение файла по умолчанию или префикс магического шаблона для содержимого файла.
Один из способов представить это - иметь абстрактный метод, который можно переопределить для предоставлениясвойство:
abstract String getDefaultExtension();
...
String getDefaultExtension() { return "txt"; }
Это работает, но нет способа выразить предположения базового класса об этом свойстве.В этом случае клиент API FileFormat
хотел бы предположить, что возвращаемое значение getDefaultExtension()
никогда не изменяется со временем.Но с переопределением нет способа объявить это намерение в подклассе или утвердить ограничение в базовом классе.
Альтернативой является использование переменной-члена.В этом случае значение расширения формата по умолчанию будет передано в конструктор базового класса.Но это не так уж и хорошо, поскольку он будет занимать место для хранения в каждом экземпляре нашего класса - в случае расширения файла все экземпляры будут иметь одинаковое расширение.
Другой способ - это Properties
решение с типом объекта, где у вас есть структура, содержащая набор настроек, которые могут быть статическими или нет, но при этом теряется безопасность типов, документация по API и т. Д.
Есть ли другие варианты или комментарии?Благодаря.