Witam :-)
Chciałbym zadać Wam doświadczonym programistom pytanie....
Otóz chodzi mi o to, w jakich sytuacjach korzystacie z interfejsów? Po co one się mogą nam przydać?
Jestem początkujący i nie dokońca rozumiem ich idee.
Idea jest taka, że jeśli wiele klas implementuje te same metody, to można użyć interfejsu, w którym są one zadeklarowane. W konkretnych klasach natomiast, tworzy się definicje tych metod, po ówczesnym zaimplementowaniu (nie dziedziczeniu) danego interfejsu.
Załóżmy, że chcesz mieć obiekt na którym można użyć using (tzn odpowiednik try-with-resources, nie znam się na składni C#) i jednocześnie można sortować kolekcje złożone z takich obiektów. Musisz więc zaimplementować interfejsy IDisposeable (chyba) do użycia przy pomocy using i interfejs chyba Comparable, aby można było sortować kolekcje złożone z tych obiektów bez konieczności podawania Comparatorów. C# nie umożliwia wielokrotnego dziedziczenia po klasach, udostępnia tylko wielokrotne dziedziczenie interfejsów (gdzie wszystkie funkcje są abstrakcyjne), więc zostaje tylko implementacja dwóch interfejsów naraz.
Rola interfejsów jest opisana na miliard sposobów w Internecie, wystarczy poszukać. Coś na co trudno się natknąć to SOLID: http://en.wikipedia.org/wiki/SOLID_(object-oriented_design) i np jedna z jego zasad: http://en.wikipedia.org/wiki/Interface_segregation_principle Oczywiście nadgorliwość jest gorsza od faszyzmu i stosowanie SOLID bez względu na okoliczności mogłoby skutkować nieoptymalnym designem, ale ogólnie zasady są OK.
Chcesz wymagać od jakiejś klasy (którą niekoniecznie sam piszesz) by udostępniała pewne metody. Np ci co stworzyli List<T> dają ci możliwość użycia funkcji Sort(). Jednak aby to zrobić, ty też coś musisz dać od siebie - pokazać jak porównać ze sobą dwa obiekty. Wydaje się to nie konieczne (tzn użycie interfejsu, można by powiedzieć programistom: macie ustostępnić taką a taką metodę). JEdnak jest to takie ujednolicenie i informacja dla klasy List<T> że może użyć metody Sort(). Ja osobiście na tym przypadku to zrozumiałem.
Ok, dzieki za odpowiedzi.
Ale czy przypadkiem klasa abstrakcyjna nie robi dokładnie albo prawie tego samego?
Też udostępnia tylko metody...
Chyba chodzi o to, że interfejs nie zawsze musimy wykorzystać w klasach a klasa abstrakcyjna jest wspolna dla wszystkich tak?
@Poczatkujacyv12 różnica jest taka, że klasa abstrakcyjna może zawierać nieabstrakcyjne metody (np. prywatne) oraz elementy takie jak konstruktor czy zmienne klasy/instancji i można dziedziczyć po klasie tylko raz. Natomiast można dziedziczyć wiele międzymordź ale one zawierają tylko metody abstrakcyjne (i nic poza tym).