2013-06-25 8 views
7

Я новичок в интерфейсах в C#. Так может кто-нибудь объяснить, что на самом деле происходит, когда мы создаем объект интерфейса?Что происходит, когда мы создаем объект интерфейса?

Я знаю, почему у нас есть интерфейсы на других языках, но я не могу понять логику Почему C# позволяет создать объект (экземпляр) интерфейса? Если интерфейсы не имеют определений функций или переменных, то как можно создать объект?

Я искал на форумах, но не мог понять. вот урок, который я нашел на интерфейсах http://www.c-sharpcorner.com/uploadfile/6897bc/interfaces-in-C-Sharp/ Если вы перейдете по ссылке, вы увидите, что сначала автор создает объект класса, а не объект inteface. Когда он пишет

Interface_object = class_object;  

объект интерфейс извлекает из особенностей объекта класса ...
Как и почему это происходит, если нет реализации и переменных в интерфейсе?

+4

Вы не можете создать открытый интерфейс, потому что у него нет кода, но на некоторых языках вы можете создать анонимную реализацию интерфейса, предоставляя на месте реализации всех методов интерфейса. Я знаю на Java, вы можете это сделать. – Patashu

+0

«Я знаю, почему у нас есть интерфейсы на других языках, но я не могу понять логику [...] C#» - можете ли вы объяснить, как? Как отличаются интерфейсы на C#? Разве Java или C++ в этом отношении почти одинаковы? Почему, по-вашему, у нас есть интерфейсы? – Kobi

+0

Интерфейс в основном определяет общую структуру для нескольких объектов, которые должны быть реализованы по-разному для каждого из них. –

ответ

9

На самом деле вы не можете создать экземпляр интерфейса.

Создается экземпляр некоторого класса, реализующего интерфейс. На самом деле могут быть десятки классов, реализующих один интерфейс. Поэтому, когда вы используете переменную типа интерфейса, единственное, что вы гарантируете, это то, что объект, на который на самом деле ссылается переменная, реализует интерфейс, и вы можете использовать любой из методов, свойств и т. Д.

interface IFoo 
{ 
    void DoFoo(); 
} 

class Foo1: IFoo 
{ 
    public DoFoo() 
    { 
     //one implementation 
    } 
} 

class Foo2: IFoo 
{ 
    public DoFoo() 
    { 
     //the other implementation 
    } 
} 

IFoo tmp = new Foo1(); 
tmp = new Foo2(); 

вы можете увидеть глубокое объяснение в SO: Using Interface variables

0

вы не можете создать объект интерфейса, но вы можете создать объект класса и класс использовать интерфейс.

0

Вы не можете создавать интерфейсы. Но вы можете создать новую ссылку интерфейса, если класс реализует интерфейс.

Это только создает новую ссылку на объект MyNokiaOldPhoneINokiaOld iface = phone;, который реализует интерфейс INokiaOld.

0

Вы не создаете экземпляр интерфейса, но присвойте ему ссылку на экземпляр производного объекта, чтобы он был завершен в этот тип интерфейса. Это полиморфизм .

0

Насколько я знаю, вы не можете создать экземпляр интерфейса, и даже если мы это сделаем, это будет бесполезно, поскольку ни один из членов этого класса не будет реализован. То же самое относится к абстрактному классу. Это происходит потому, что они неполны (т. Е. Действуют как шаблоны), и создание объекта не имеет смысла для неполных классов.

2

Может кто-нибудь объяснить, что на самом деле происходит, когда мы создаем объект интерфейса?

Аналог, который мне нравится использовать, заключается в том, что интерфейс подобен маске - при создании экземпляра класса, который реализует интерфейс (например,IFoo), тогда рассмотрим класс как интерфейс, тогда интерфейс будет похож на маску, которую будет носить актер, - класс кажется и действует как интерфейс (маска), даже если есть целая куча вещей под маской (интерфейс).

но не может по-настоящему понять логику Почему C# позволяет создать объект (экземпляр) интерфейса?

Следует отметить, что интерфейс - это контракт - любые методы/свойства/и т. Д. Определены на интерфейсе, которые будут реализованы в классе. Классы, которые полностью и совершенно разные друг другу, могут реализовать один и тот же интерфейс - когда у вас есть экземпляр каждого класса и его обрабатывают (передают) в качестве интерфейса, тогда одни методы могут быть вызваны для каждого класса, хотя реализация (фактическая код) в каждом классе может быть совершенно иным.

Пример:
Классы Car и Human и реализуют интерфейс IMove и IMove определяет метод void Move();. Они оба совершенно несвязанные классы, не имеющие общей родословной, но если у вас есть экземпляр Car and Human, то они оба гарантированно имеют метод void Move(), хотя код в этом методе будет отличаться между ними по мере их перемещения в совершенно разных пути. Если вы затем переместите эти разные объекты в один и тот же интерфейс (var x = (IMove) someCar или var x = someHuman as IMove), то вы можете обращаться с объектной ссылкой одинаково.

Интерфейсы и абстрактные классы имеют некоторое сходство - они оба задают вещи договорно (расширитель или разработчик должен реализовывать определенные вещи), и оба они не могут быть созданы напрямую (разница в том, что абстрактные классы могут обеспечить некоторую реализацию тогда как интерфейсы не могут, и интерфейсы могут быть реализованы, никогда не унаследованы).

Если вам интересно, что происходит под капотом на уровне MSIL, то здесь есть другие люди с более высокой квалификацией, которые могут подробно остановиться на этом.

1

Интерфейс - это просто интерфейс. Вы не можете создать интерфейс. Вы можете использовать его как переменную, которая указывает на класс, который реализует этот интерфейс. Интерфейс представляет собой публичный набор методов/свойств с гарантией реализации всех его методов. Абстрактные классы аналогичны интерфейсам, но не обеспечивают такую ​​гарантию.

В ООП это своего рода полиморфизм, и существуют другие типы полиморфизмов.