Этот код не работает так, как вы ожидаете, потому что он работает точно в соответствии со спецификацией языка.
В основном в вашем классе CustomManager Вы реализуете ISearchable неявно и явно.Когда вы хотите попытаться вызвать этот метод в обычном коде (без использования отражения), это выглядит так:
CustomManager k = new CustomManager();
IPhoneSearchable x = k;
x.Search("strings"); //calls IPhoneSearchable.Search()
ISearchable y = k;
y.Search("string"); //calls ISearchable.Search()
k.Search("string); //calls ISearchable.Search()!!!
причина этого именно в том, чтобы не путать кодер.Вы реализуете интерфейс в классе, поэтому каждый вызов этого метода должен вызывать эту реализацию.Если по какой-то другой причине Вы реализуете другой интерфейс явно, Вам необходимо указать, что Вы хотите, чтобы этот точный вызов происходил.
Я не хочу вмешиваться в Ваш дизайн, но для меня это выглядит немного странно.Один метод ищет что-то, а другой ищет определенные вещи, но оба имеют одинаковую сигнатуру, предоставляя слегка отличающиеся функциональные возможности.Возможно, следует изменить, чтобы IPhoneSearchable
предоставлял метод с именем
SearchPhones(string[] filters)
, который фактически вызывает метод Search, таким образом скрывая детали реализации от пользователя.Предоставляя Inteface IPhoneSearchable, вы ничего не делаете в спецификации контракта, кроме предоставления интерфейса маркера.
Итак, чтобы исправить свой код Вам, вероятно, следует создать коллекцию реальных MethodCalls (следовательно, в CustomManager есть два вызова метода, а именно Search fromISearchable и Search from IPhoneSearchable)
, итерация этой коллекции и вызов каждого метода.
Относительно Люка