Могу ли я создать экземпляр подкласса с использованием фабричного метода Stati c суперкласса? - PullRequest
3 голосов
/ 29 апреля 2020

Проблема:

Я хочу расширить Java java .util. BitSet , используя мой собственный MyBitSet, просто чтобы добавить некоторые функциональные возможности / методы преобразования, которые я часто использую.

Метод BitSet, который я действительно считаю полезным в своем коде, это "фабричный" publi c stati c метод BitSet .valueOf (long []) , поэтому я хочу, чтобы мой класс MyBitSet предлагал ту же утилиту для создания экземпляра MyBitSet из предоставленного long [].

Проблема в том, что BitSet Java обеспечивает нет конструктора publi c, принимающего аргумент long [], поэтому я не могу просто использовать super ().

И BitSet.valueOf (long []) возвращает новый объект BitSet, поэтому я не могу просто привести его к моему подклассу MyBitSet из-за исключения ClassCastException.

Кроме того, BitSet.valueOf (long []) метод устанавливает некоторые из частных переменных BitSet, к которым у меня нет доступа через мой подкласс MyBitSet, поэтому я не вижу простого способа просто скопировать реализацию суперкласса напрямую - плохое решение, но я просто рассматриваю мои варианты здесь.

Вопрос:

Могу ли я как-то обеспечить такую ​​функциональность в моем подклассе MyBitSet?

В общем, возможно ли это использовать "фабричные" методы stati c, такие как valueOf (long []), для создания экземпляра моего собственного подкласса?

Есть что-то, что я мог упустить из виду?

Решение Я бы предпочел избежать:

Альтернативным решением будет использование класса-оболочки BitSet вместо его расширения.

А именно, класс, содержащий экземпляр BitSet как переменная и применение т В этой переменной BitSet мне требуются дополнительные функции. Однако этот подход сейчас выглядит немного странно, и я бы предпочел просто расширить BitSet, если это возможно.

Вопрос типа «для размышлений»:

BitSet.valueOf ( long []) - это метод, который создает новый экземпляр BitSet в инициализированном состоянии , специфицирующем c, вместо состояния по умолчанию .

Может ли это быть, не предлагая такую ​​публикацию * Конструктор 1058 *, но только "фабричный" метод stati c, на самом деле является заданным шаблоном, чтобы разработчики не могли использовать его для инициализации своего собственного экземпляра подкласса в состоянии, отличном от значения по умолчанию?

Если так, то почему? В чем проблема в таком случае?

1 Ответ

1 голос
/ 09 мая 2020

Могу ли я как-то обеспечить такую ​​функциональность в моем подклассе MyBitSet?

В общем, возможно ли использовать "фабричные" методы stati c, например valueOf (long []) создать экземпляр моего собственного подкласса?

Вы, конечно, можете добавить новый фабричный метод stati c в свой подкласс; но он не будет наследовать какой-либо метод от родительского класса. Клиенты должны будут найти ваш новый метод stati c и знать, как его вызвать.

Есть ли что-то, что я мог упустить из виду?

Вы говорите, что это оболочка класс чувствует себя немного странно . Я не знаю, что это значит, но вы, возможно, слышали, Предпочитать композицию наследованию .

вместо этого «фабричный» метод stati c, фактически предполагаемый шаблон

Да, Stati c Factory Method , безусловно, является предполагаемым шаблоном. Его плюсы и минусы перечислены в теге вики. Шаблон может быть довольно гибким или полностью негибким в зависимости от того, как он реализован. Если автор хочет использовать его для применения определенных c значений по умолчанию, это один негибкий вариант использования.

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