Я пытаюсь реализовать разреженные наборы из этой статьи в Go и собрать их в пакет.В ранней реализации API был чистым и минимальным, только с экспортированным типом Sparse
и экспортированным методом Insert
, Delete
, Has
, Union
, Intersection
, Clear
и Len
, довольномного только операций с базовыми наборами.
Позже я хочу добавить новые функциональные возможности, которые могут автоматически резервировать элемент (давайте назовем его AutoSparse
).Если Sparse
имеют Insert(k int)
, которые вставляют k в наборы, AutoSparse
имеют Reserved()
зарезервировали доступный элемент.Если у меня {0 1 2 4 5}
в AutoSparse
, когда я звоню Reserve()
, он должен добавить 3, а не 6, так что теперь он становится {0 1 2 4 5 3}
.Вот реализация на детская площадка .
Как вы можете видеть, чтобы поддерживать, какой элемент добавляется в наборы, он не добавляет новое поле в struct
, и я хочуоставьте это так.
Мой вопрос: как добавить эту новую функциональность в мой пакет без добавления нового экспортируемого типа AutoSparse
, чтобы сохранить API чистым и минимальным?
Это то, что я уже пробовал:
- Я могу использовать
interface
, чтобы скрыть реализацию, но сигнатура функции отличается, одно использование Insert(k int)
, другое использование Reserve()
,даже если я использую имя Insert()
, оно все равно другое, или я должен использовать Insert(k int)
, но не использовал k
вообще?может, но это неудобно. - Я не могу использовать тот же
struct
для реализации этого, потому что как только вы используете Reserve()
для добавления элемента, вы не можете использовать Insert(k int)
, потому что это испортитЗарезервированный элемент, даже Delete
и Clear
отличается.