У меня есть пара классов BitMask и BitMaskLarge, которые оба реализуют интерфейс IBitMask, который предоставляет функциональность для выполнения побитовых логических операций и т. Д. Класс BitMask содержит частное поле _mask типа long, а класс BitMaskLarge содержит частный массив _masks длинных.
Конечный пользователь работает с IBitMask, и детали реализации каждого из классов должны быть им прозрачны, например, как реализована побитовая логика, когда оба входа имеют один тип, а не один тип.
При создании IBitMask используется BitMaskFactory, который возвращает соответствующий тип на основе пропускной способности, передаваемой в конструктор.
Проблема возникает при установке бита в битовой маске с помощью метода SetBitIndex. Если бит находится за пределами текущей маски, BitMaskLarge просто добавляет еще один элемент в _masks и устанавливает соответствующий бит. Однако BitMask не может выходить за рамки 64 битов, поэтому необходимо преобразовать его в BitMaskLarge. Очевидно, что это невозможно при вызове bitmask.SetBitIndex (100) для класса BitMask, который должен установить бит на индекс 100.
Одним из возможных решений, которое я могу придумать, было бы сделать SetBitIndex внутренним и создать статический метод в BitMaskFactory, который возвращал новый или обновленный IBitMask. Это не идеально, так как это не естественно для использования. Если у кого-то есть лучшее решение этой проблемы, я хотел бы услышать это. Все идеи приветствуются, независимо от того, насколько фундаментальными являются изменения.