Dlaczego używamy interfejsu?
Czy dotyczy tylko normalizacji?
Dlaczego używamy interfejsu?
Czy dotyczy tylko normalizacji?
Odpowiedzi:
Analogia 1 : Podobnie jak amerykański prom kosmiczny, rosyjski statek kosmiczny Sojuz i chiński Shenzhou 5 mogą zadokować na Międzynarodowej Stacji Kosmicznej, ponieważ mają ten sam interfejs dokowania. (To tylko przykład - nie wiem, czy to prawda w prawdziwym życiu, ale zawieśmy nasze niedowierzanie dla przykładu)
Analogia 2 : Tak jak możesz podłączyć różne monitory komputerowe do komputera domowego. Można do niego podłączyć ścienny telewizor, stary kineskop (gruby), 20-calowy płaski ekran lub brajlowską maszynę dla niewidomych, aby „widzieć” dotykiem. Jest kompatybilność między tymi różnymi / różnymi urządzeniami i komputer, ponieważ wszyscy zgadzają się ze standardami interfejsów.
Szczegóły interfejsów C # - z interfejsami C # / OOP robisz to samo, ale w niewidocznym / wirtualnym świecie.
Masz rację co do standaryzacji , ale także elastyczności , skalowalności , rozszerzalności , łatwości konserwacji , możliwości ponownego wykorzystania , testowalności i mocy .
(Im częściej używasz interfejsów programowych, tym lepiej zrozumiesz te „modne słowa”. Zawsze rozważaj interfejsy w prawdziwym świecie, ponieważ zrobiły to dla nas równie dobrze).
standardization, but also flexibility, scalability, extensibility, maintainability, reusability, testability and power.
Interfejs jest używany do opisania tego, co może zrobić zaimplementowana rzecz. Masz więc możliwość traktowania kilku obiektów, które implementują ten sam interfejs, jako typ tego interfejsu.
Na przykład:
public interface IMyInterface{
public void DoFirst();
public int DoSecond();
}
public class A : IMyInterface{
//class has to implement DoFirst and DoSecond
public void DoFirst(){
Console.WriteLine("Blubb1");
}
public int DoSecond(){
Console.WriteLine("Blubb2");
return 2;
}
}
public class B : IMyInterface{
//class has to implement DoFirst and DoSecond
public void DoFirst(){
Console.WriteLine("Blibb1");
}
public int DoSecond(){
Console.WriteLine("Blibb2");
return 4;
}
}
Klasy implementują interfejs na kilka sposobów. Ale możesz ich używać jako IMyInterface. Na przykład:
public static void DoMethodsInInterface(IMyInterface inter){
inter.DoFirst();
inter.DoSecond();
}
public static void main(){
DoMethodsInInterface(new A());
DoMethodsInInterface(new B());
//Or use it in a List
List<IMyInterface> interlist = new List<IMyInterface>();
interlist.Add(new A());
interlist.Add(new B());
foreach(IMyInterface inter in interlist){
inter.DoFirst();
}
}
Mam nadzieję, że to wyjaśnia nieco, dlaczego interfejsy są przydatne.
Woozle
, dowolny kod, który chciałby zaakceptować odwołanie do którejkolwiek z klas i Woozle
musiałby wiedzieć, z którą klasą ma do czynienia, i byłby w stanie tylko te Woozle
klasy, o których wiedział. Z drugiej strony, jeśli obie klasy implementują IWoozler
, to kod, który jest podany, IWoozler
może Woozle
to zrobić bez konieczności znajomości jego dokładnego typu.
Służy do łączenia się :), abyś mógł połączyć się między rzeczami, jest to przydatne, gdy masz
Oto widok wysokiego poziomu ...
Interfejsy odgrywają dużą rolę w koncepcji ukrywania informacji .
Zasadniczo pomagają one ukryć szczegóły implementacji Twojej klasy, dzięki czemu klasa wywołująca nie jest zależna od tej implementacji. W związku z tym za pomocą interfejsów można modyfikować implementację bez zmiany klasy wywołującej. To wszystko z kolei ogranicza złożoność kodu i ułatwia jego utrzymanie w dłuższej perspektywie.
Kiedy po raz pierwszy zacząłem rozumieć interfejsy, wyjaśniono mi je jako „kontrakt, który zawiera opis Twojej klasy”. Nie jestem pewien, czy to ci pomoże, ale jeśli pomyślisz o interfejsie do samochodu, możesz powiedzieć, że jeździ , psuje się i skręca . Tak długo, jak prowadzi mnie z punktu A do punktu B, tak naprawdę nie muszę wiedzieć, jak te funkcje są implementowane.
Głównym powodem, dla którego interfejsy są używane w językach takich jak C # / Java, jest to, że języki te nie obsługują dziedziczenia wielokrotnego (klasowego) (zobacz Jaki jest dokładny problem z dziedziczeniem wielokrotnym? ).
Jednak dozwolona jest wielokrotna implementacja (interfejs), co pozwala na używanie klas na różne sposoby.
Interfejsy są nieco niewygodne. Wspierają projektowanie na podstawie umowy tylko wierząc, że ta sama nazwa i zaimplementowany interfejs oznaczają takie samo zachowanie. Działa to tylko dzięki dokumentacji API, musi zostać sprawdzone przez człowieka. To sprawia, że interfejsy są zbyt słabe. Jednym ze sposobów obejścia tego może być formalna specyfikacja. Z drugiej strony interfejsy są zbyt mocne, zbyt rygorystyczne. Nie można rozwijać interfejsów, które często przeszkadzają w ponownym użyciu. Rozwiązują to protokoły - mechanizm w językach dynamicznych, które wysyłają wiadomości (metody wywołania) i gdy ta wiadomość nie jest obsługiwana przez odbiorcę, wywoływane jest standardowe callback. Posiadanie konkretnych protokołów z ograniczeniami byłoby o wiele lepsze.
Myśl zdalnie ...
W grę wchodzi klient i serwer. Powiedzmy, że są fizycznie oddzielone przez internet. Klient wywołuje metodę, której rzeczywiste wykonanie odbywa się na serwerze. Z punktu widzenia klienta klient nie wie nic o obiekcie na serwerze, który wykonuje wykonanie. Jednak wie, jaką metodę wywołać. Ponieważ budując program klienta, jesteśmy narażeni tylko na interfejs (lub kontrakt). Nie jesteśmy narażeni na cały obiekt, który faktycznie żyje na serwerze. Spróbuj zrobić kilka aplikacji demonstracyjnych w zdalnej usłudze .net, a zajmiesz się resztą. Miłego programowania.
Dlaczego używamy interfejsów?
Niektóre języki wdrożyć polimorficzne połączeń Metoda z zastosowaniem vtables i wyrzucić większość informacji typu utrudniając nie zdefiniowanie interfejsów.
Więc czasami po prostu używamy interfejsów, ponieważ wymaga tego projekt języka.
Interfejs dostarcza prototypowego modalu, który zawiera tylko deklarację funkcjonalności określonego zachowania.
a jeśli chcesz zaimplementować to zachowanie w klasie, musisz zaimplementować ten interfejs w klasie, a następnie klasa ma taką funkcjonalność zachowania lub może mieć wiele zachowań.
ponieważ klasa może implementować wiele interfejsów.
Jeśli ktoś jest podobny do mnie i uczy się poprzez przykład i działanie, a nie tylko wyjaśnianie, oto kod ...
Znalazłem tę implementację sieci neuronowej w C #, w tym pobieranie projektu, która wykorzystuje interfejsy w elegancki i użyteczny sposób: