Instancjacja interfejsu a instancjacja klasy

Czy ktoś mógłby mi pomóc zrozumieć, czy poniższe kody są takie same. Jeśli nie, to jaka jest różnica między instancją klasy A instancją interfance.

IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()

O ile rozumiem, Inteface ma tylko podpis metody i jeśli interfejs został zaimplementowany przez 3 klasy. Nie jestem pewien, która z 3 instancji zostanie utworzona przez pierwsze polecenie powyżej.

Dziękuję.
Author: NullUserException, 2011-08-27

4 answers

Interfejsy nie mogą być tworzone z definicji. Zawsze tworzysz konkretne zajęcia.

Więc w obie wypowiedzi twoja instancja jest rzeczywiście typu UnityContainer.

Różnica dotyczy pierwszego stwierdzenia, jeśli chodzi o C#, Twoje {[3] } jest czymś, co implementuje IUnityContainer, które może mieć API inne niż UnityContainer.


Rozważmy:

interface IAnimal 
{
    void die();
}

class Cat : IAnimal 
{
    void die() { ... }
    void meow() { ... }
}

Teraz:

IAnimal anAnimal = new Cat();
Cat aCat= new Cat();

C # wie na pewno anAnimal.die() działa, ponieważ die() jest zdefiniowany w IAnimal. Ale to nie pozwoli Ci zrobić anAnimal.meow(), nawet jeśli jest to Cat, podczas gdy {[11] } może wywołać obie metody.

Kiedy używasz interfejsu jako swojego typu, w pewnym sensie tracisz informacje.

Jednakże, jeśli masz inną klasę Dog, która również implementuje IAnimal, twoja anAnimal może również odwoływać się do instancji Dog. To jest moc interfejsu; możesz dać im dowolną klasę, która go implementuje.

 46
Author: NullUserException,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 00:04:50

Naprawdę nie ma czegoś takiego jak "instancja interfejsu" , ale są zmienne interfejsu. Pierwsza linia jest przykładem takiej zmiennej.

W pierwszej linii możesz utworzyć instancję container jako dowolną konkretną klasę implementującą IUnityContainer. W drugiej linii obiekt {[0] } może być utworzony tylko z klasy UnityContainer lub klasy pochodnej.

Gdy używasz zmiennych interfejsu w kodzie, pozwala to łatwiej przełączyć konkretną implementację, co sprawia, że Twój kod jest bardziej elastyczny.

 3
Author: FishBasketGordo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 00:12:26

Obiekt utworzony i przechowywany w zmiennej IUnityContainer container jest uważany przez kompilator za mający tylko elementy zdefiniowane w interfejsie IUnityContainer. Oznacza to, że jeśli klasa UnityContainer zawiera elementy, które nie są zdefiniowane przez interfejs IUnityContainer, nie będzie można ich wywołać. Z drugiej strony, można "umieścić" dowolny obiekt implementujący Interfejs IUnityContainer W Zmiennej IUnityContainer container - nie tylko instancje UnityContainer. Z drugą deklaracją utkniesz z instancjami UnityContainer i obiektami w jej hierarchia dziedziczenia.

Sprawdź C# Programming Guide to Interfaces aby uzyskać więcej informacji na temat interfejsów i sposobu ich użycia.

 0
Author: Isaac Overacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 00:06:22

Utworzenie Interfejsu nie jest możliwe. Ale kiedy stworzyliśmy obiekt an dla interfejsu używając zaimplementowanej klasy to działa.

IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class.
UnityContainer container = new UnityContainer() // To access directly by using like this.

Załóżmy, że istnieje dziedziczenie wielokrotne, aby to osiągnąć, musimy iść z pierwszym.

Nie ma potrzeby, aby zapewnić takie rzeczy idziemy drugą drogą.

Interfejsy ograniczają bezpośredni dostęp do danych i członków jego klasy.

 0
Author: Balujavac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 17:38:03