Что происходит при одинаковых методах в нескольких интерфейсах в C#
Что проверяют
Знаете ли вы, что одинаковые сигнатуры в двух интерфейсах это не ошибка, и понимаете ли разницу между неявной и явной реализацией. Заодно проверяют, представляете ли вы, зачем явная реализация в языке вообще появилась.
Как отвечать
Если два интерфейса объявляют метод с одинаковой сигнатурой, класс может закрыть оба одним открытым методом. Это компилируется и работает, вызов через любую из интерфейсных ссылок попадает в один и тот же код.
interface IFirst { void Run(); }
interface ISecond { void Run(); }
class Worker : IFirst, ISecond
{
public void Run() { } // закрывает оба контракта
}Разное поведение для разных контрактов делается явной реализацией:
class Worker : IFirst, ISecond
{
void IFirst.Run() { }
void ISecond.Run() { }
}У явной реализации своя цена: такой метод не входит в открытый интерфейс класса, вызвать его можно только через ссылку соответствующего типа, в том числе изнутри самого класса через приведение, и модификаторы доступа к нему не применяются. Классический пример это тип, реализующий обобщённый и необобщённый перечислители: методы различаются только возвращаемым значением, и разрулить конфликт можно лишь явной реализацией.
Где спотыкаются
Уверенно отвечают, что совпадение сигнатур приводит к ошибке компиляции. Это неверно: один метод спокойно реализует оба интерфейса, и чаще всего именно так и нужно. Явная реализация требуется, только когда поведение должно различаться или когда подписи конфликтуют по возвращаемому типу.
Второе: забывают, что явно реализованный метод не виден через тип класса. Пишут вызов на переменной класса и упираются в ошибку компилятора, хотя метод «есть». Нужна ссылка интерфейсного типа, а для структуры такое приведение означает ещё и упаковку, то есть копию в куче на каждом вызове.
Третье: не учитывают реализации по умолчанию в интерфейсах. Метод с телом, объявленный в интерфейсе и не переопределённый в классе, членом класса не становится: через переменную класса его не вызвать. А когда два интерфейса дают одноимённые методы со своими телами, ответ на вопрос, что именно выполнится, зависит от того, к какому интерфейсу привели ссылку.