Що відбувається, коли ми створюємо об'єкт інтерфейсу?

Я новачок у інтерфейсах у C #. Так може хтось пояснити, що насправді відбувається, коли ми створюємо об'єкт інтерфейсу?

Я знаю, чому у нас є інтерфейси на інших мовах, але не може зрозуміти логіку Чому C# дозволяє створювати об'єкт (екземпляр) інтерфейсу? Якщо інтерфейси не мають визначень функцій або змінних, то як може бути створений об'єкт?

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

Interface_object = class_object;    

об'єкт інтерфейсу витягує функції з об'єкта класу ...
Як і чому це відбувається, якщо в інтерфейсі немає реалізації та змінної?

8
"Я знаю, чому у нас є інтерфейси на інших мовах, але не може зрозуміти логіку [...] C #" - чи можете ви пояснити, як? Як відрізняються інтерфейси в C #? Чи не є Java або C ++ майже так само в цьому відношенні? Чому, на вашу думку, у нас є інтерфейси?
додано Автор Kobi, джерело
Ви не можете створити оголений інтерфейс, оскільки він не має коду, але в деяких мовах можна створювати анонімну реалізацію інтерфейсу, надаючи на місці реалізації всіх методів інтерфейсу. Я знаю, що в Java ви можете це зробити.
додано Автор Patashu, джерело
Інтерфейс в основному визначає загальну структуру для декількох об'єктів, які необхідно реалізувати по-різному для кожного.
додано Автор Potecaru Tudor, джерело

7 Відповіді

Насправді ви не можете створити примірник інтерфейсу.

Ви створюєте екземпляр деякого класу, що реалізує інтерфейс. Насправді можуть бути десятки класів, що реалізують один інтерфейс. Тому, коли ви використовуєте змінну типу інтерфейсу, єдине, що вам гарантовано, полягає в тому, що об'єкт, на який насправді посилається змінна, реалізує інтерфейс, і ви можете використовувати будь-який з методів інтерфейсу, властивостей і т.д.

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();

You may see a deep explanation in SO: Using Interface variables

11
додано

Чи може хтось пояснити, що відбувається, коли ми створюємо об'єкт інтерфейсу?

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

але не може зрозуміти логіку Чому C# дозволяє створювати об'єкт (екземпляр) інтерфейсу?

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

Example:
The classes Car and Human both implement the interface IMove, and IMove defines the method void Move();. They are both totally unrelated classes with no common ancestry, but if you have an instance of Car and Human, then they are both guaranteed to have the method void Move(), although the code in that method will differ between then them as they move in totally different ways. If you then cast these different objects to the same interface (var x = (IMove) someCar or var x = someHuman as IMove) then you can treat the object reference identically.

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

Якщо ви замислюєтеся, що відбувається під капотом на рівні MSIL, то тут є інші, набагато більш кваліфіковані люди, які можуть детально розглянути це питання.

2
додано

Інтерфейс - це просто інтерфейс. Не можна створювати інтерфейс. Ви можете використовувати його як змінну, яка вказує на клас, який реалізує цей інтерфейс. Інтерфейс - це публічна колекція методів/властивостей з гарантією реалізації всіх його методів. Абстрактні класи подібні до інтерфейсів, але не забезпечують такої гарантії.

У ООП це свого роду поліморфізм і існують інші типи поліморфізмів.

1
додано

Ви не створюєте примірник інтерфейсу, але прив'язуєте до неї посилання на похідний примірник об'єкта, щоб він перетворився на цей тип інтерфейсу. Це поліморфізм .

0
додано

Наскільки я знаю, ви не можете створити примірник інтерфейсу і навіть якщо ми це зробимо, він не буде корисний, оскільки жоден з членів цього класу не буде реалізовано. Те ж саме відбувається і з абстрактним класом. Це відбувається тому, що вони є неповними (тобто, вони діють як шаблони), і створення об'єкта не має сенсу для неповних класів.

0
додано

Ви не можете створювати інтерфейси. Але можна створити нову посилання на інтерфейс, якщо клас реалізує інтерфейс.

Це лише створює нове посилання на об'єкт MyNokiaOldPhone INokiaOld iface = phone; , який реалізує інтерфейс INokiaOld .

0
додано

Ви не можете створити об'єкт інтерфейсу, але ви можете створити об'єкт класу і дати клас використовувати інтерфейс.

0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug