Может кто-нибудь объяснить, что на самом деле происходит, когда мы создаем объект интерфейса?
Аналог, который мне нравится использовать, заключается в том, что интерфейс подобен маске - при создании экземпляра класса, который реализует интерфейс (например,IFoo), тогда рассмотрим класс как интерфейс, тогда интерфейс будет похож на маску, которую будет носить актер, - класс кажется и действует как интерфейс (маска), даже если есть целая куча вещей под маской (интерфейс).
но не может по-настоящему понять логику Почему C# позволяет создать объект (экземпляр) интерфейса?
Следует отметить, что интерфейс - это контракт - любые методы/свойства/и т. Д. Определены на интерфейсе, которые будут реализованы в классе. Классы, которые полностью и совершенно разные друг другу, могут реализовать один и тот же интерфейс - когда у вас есть экземпляр каждого класса и его обрабатывают (передают) в качестве интерфейса, тогда одни методы могут быть вызваны для каждого класса, хотя реализация (фактическая код) в каждом классе может быть совершенно иным.
Пример:
Классы Car
и Human
и реализуют интерфейс IMove
и IMove
определяет метод void Move();
. Они оба совершенно несвязанные классы, не имеющие общей родословной, но если у вас есть экземпляр Car and Human, то они оба гарантированно имеют метод void Move()
, хотя код в этом методе будет отличаться между ними по мере их перемещения в совершенно разных пути. Если вы затем переместите эти разные объекты в один и тот же интерфейс (var x = (IMove) someCar
или var x = someHuman as IMove
), то вы можете обращаться с объектной ссылкой одинаково.
Интерфейсы и абстрактные классы имеют некоторое сходство - они оба задают вещи договорно (расширитель или разработчик должен реализовывать определенные вещи), и оба они не могут быть созданы напрямую (разница в том, что абстрактные классы могут обеспечить некоторую реализацию тогда как интерфейсы не могут, и интерфейсы могут быть реализованы, никогда не унаследованы).
Если вам интересно, что происходит под капотом на уровне MSIL, то здесь есть другие люди с более высокой квалификацией, которые могут подробно остановиться на этом.
Вы не можете создать открытый интерфейс, потому что у него нет кода, но на некоторых языках вы можете создать анонимную реализацию интерфейса, предоставляя на месте реализации всех методов интерфейса. Я знаю на Java, вы можете это сделать. – Patashu
«Я знаю, почему у нас есть интерфейсы на других языках, но я не могу понять логику [...] C#» - можете ли вы объяснить, как? Как отличаются интерфейсы на C#? Разве Java или C++ в этом отношении почти одинаковы? Почему, по-вашему, у нас есть интерфейсы? – Kobi
Интерфейс в основном определяет общую структуру для нескольких объектов, которые должны быть реализованы по-разному для каждого из них. –