Как сказал Нил Барнвелл, Адаптер - это путь. Но будьте осторожны, интерфейсы не должны использоваться таким образом, и, хотя это может пригодиться, вы должны хотя бы тщательно обдумать это.
Видите, интерфейс не является биективными функциями, они предназначены для предоставления набора «правил», определяющих, на что объект способен делать «да», но порядок, в котором они должны их использовать, заключается в том, чтобы сначала определить их для описания дизайн вашего приложения (или что-то, что вам нужно), а затем использовать его, а не наоборот. Или, другими словами, интерфейс определяет поведение в контексте ВАШЕГО приложения, которое может или не может конфликтовать с предполагаемым использованием .NET Framework.
Это означает, что для каждого класса, который вы «адаптируете», вы должны убедиться, что он не только соответствует синтаксису интерфейса (то же имя метода, те же параметры) , но и соответствует духу интерфейса.
Например, у меня может быть класс с методом Dispose ... это не обязательно означает, что он реализует IDisposable ... возможно, это не так, потому что мой метод Dispose может вызвать исключение или заблокировать на определенное время Таким образом, при выполнении контракта это не соответствует духу.
Теперь, это может произойти и в вашем приложении, но гораздо менее вероятно, потому что вы знаете интерфейс, поэтому вполне естественно, что вы придерживаетесь его духа ... но как разработчик .NET Framework может сделать то же самое?