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ę.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.
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.
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.
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.
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