An alternative that you might want to consider is dynamic proxies . This allows you to use the reflection style API to process requests made on this interface - it would be very simple to delegate all calls to the base implementation, adding some logging logic if the method name corresponded to one of the acceptance methods.
The disadvantage of this approach is that it adds a little extra overhead for all method calls (almost certainly negligible for general use, although this should be a yellow flag if used in a performance-critical section), and the code may end up looking cumbersome. Ultimately, what you do determines exactly the same behavior that you describe in your post, except that you do not need to explicitly write each delegation method, but provide a kind of wildcard implementation.
source share