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