Two reasons:
1. If a subclass doesn't need to implement a given function (doesn't have any action needed before or after saving for instance), then it doesn't need to be cluttered with an empty method definition.
2. If we add further lifecycle events in the future, then classes implementing the interface will break, but classes extending the BaseComponentSystem will continue to work because they will have the default empty implementation for their method. So this allows us to introduce new methods in the future without breaking modules.