Хм, вы можете «спрятать» методы Action_, явно реализовав эти методы.
Если вы сделаете это, пользователи могут вызывать эти методы только тогда, когда они возвращают класс обратно в интерфейс.
Однако это не помешает им иметь возможность вызывать эти методы, но, возможно, это сделает менее очевидным, что это возможно.
public class EditField : IEditField
{
public EditField( IStateMachine stateMachine ) {}
void IEditField.Action_Commit() {}
void IEditField.Action_Undo() {}
}
Используя эти методы, пользователь не сможет сделать это:
EditField ef = new EditField();
ef.Action_Commit(); // compile-error
Однако эти методы можно вызывать, если они делают это:
IEditField ef = new EditField();
ef.Action_Commit();
или
EditField ef = new EditField()
((IEditField)ef).Action_Commit();
Но разве не лучше / возможно ли использовать эти методы Commit & Undo в составе IStateMachine?
И, если вы не можете изменить дизайн, чтобы эти методы Commit & Undo были частью IStateMachine, то, возможно, вы можете создать абстрактный класс вместо интерфейса IEditField?
В этом абстрактном классе вы можете сделать эти методы Action_ защищенными.