Зачем класс реализует интерфейс, который наследуется другим интерфейсом этого класса?
1,00
р.
р.
Просматривая исходник AutoMapper, наткнулся на интересную вещь: Класс Mapper: public class Mapper : IRuntimeMapper, IMapper { //... Интерфейс IRuntimeMapper: public interface IRuntimeMapper : IMapper { //...
Вопрос Зачем Mapper реализует IMapper, если IRuntimeMapper уже наследует его? Такая "ошибка" возникла в ходе расширения библиотеки или это нормальная практика?
Ответ В исходниках автомаппера на гитхабе строчки public class Mapper : IRuntimeMapper, IMapper нет и никогда не было, судя по логам. Декомпиляторы могут показывать всю цепочку наследования интерфейсов интерфейсов по достаточно странной причине - наследование классов и интерфейсов в C# работает по разному. В случае иерархии классов каждый потомок имеет ровно одного явного родителя: class A {} class B : A {} class C : B {} В случае интерфейса срабатывает механизм схлопывания иерархии: A class or struct that directly implements an interface also directly implements all of the interface's base interfaces implicitly. This is true even if the class or struct doesn't explicitly list all base interfaces in the base class list. Компилятор ищет все базовые интерфейсы, строит из них полный список и дописывает их в качестве реализуемых. Так что он превращает interface A { } interface B : A { } public class SomeClass : B { } в public class SomeClass : B, A { } Именно в таком виде список унаследованных интерфейсов сохраняется в метаданных, и декомпиляторы просто не могут выяснить - было ли упоминание двух интерфейсов в оригинальном коде, или их дописал компилятор.