Я пишу программу на С#, которая должна поддерживать отмену/повтор. Для этой цели я остановился на шаблоне Command; tldr, каждая операция, которая манипулирует состоянием документа, должна выполняться объектом Command, который знает о предыдущем состоянии документа, а также об изменениях, которые необходимо внести, и способен выполнить/отменить себя.
Он отлично работает для простых операций, но теперь у меня есть операция, которая затрагивает сразу несколько частей документа. Точно так же объект Command должен быть достаточно умным, чтобы знать все старое состояние, которое ему необходимо сохранить на случай, если его потребуется отменить.
Проблема заключается в раскрытии всего этого состояния с использованием общедоступных интерфейсов, которое может быть использовано не по назначению, если кто-то попытается вызвать интерфейс напрямую, что может привести к повреждению состояния. Моя интуиция подсказывает мне, что наиболее ООП-способ сделать это — предоставить специализированные классы Command — вместо того, чтобы позволять вам напрямую манипулировать состоянием документа, все, что вы можете сделать, это попросить документ создать объект Command, который имеет доступ к его внутреннее состояние и гарантированно знает достаточно, чтобы правильно поддерживать отмену/возврат.
К сожалению, C# не поддерживает концепцию друзей, поэтому я не могу создать класс Command, имеющий доступ к внутренним компонентам документа. Есть ли способ предоставить закрытые члены класса документа другому классу или есть какой-то другой способ сделать то, что мне нужно, без необходимости раскрывать множество внутренних документов?