В этом коде нет ничего плохого (при условии, что он не сбивает с толку ваших пользователей), и это не шаблон с каким-либо именем, с которым я знаком. CanDoThisAndThat
реализует два интерфейса, поэтому клиенты могут использовать его любым способом.
.NET позволяет реализовывать интерфейсы таким способом - известный как явная реализация интерфейса .
Явная реализация интерфейса полезна, когда:
- Два интерфейса имеют одинаковое определение элемента
- Вам необходимо реализовать интерфейс, но вы не хотите публиковать информацию о том, что конкретный элемент доступен клиентскому коду, который не объявил ссылку с использованием типа интерфейса
Пример случая 2 из .NET Framework - ICollection.SyncLock
. List<T>
реализует ICollection
, но следующий код не будет компилироваться, поскольку элемент намеренно был «скрыт», так как разработчики BCL больше не поддерживают блокировку коллекций таким образом:
List<object> list = new List<object>();
lock (list.SyncRoot) // compiler fails here
{
// ...
}
Любой устаревший код этого формата будет по-прежнему работать, поскольку ссылка имеет тип ICollection
явно:
ICollection list = new List<object>();
lock (list.SyncRoot) // no problem
{
// ...
}