Rola interfejsów

0

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.

0

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.

0

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.

0

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.

0

Ok, dzieki za odpowiedzi.
Ale czy przypadkiem klasa abstrakcyjna nie robi dokładnie albo prawie tego samego?
Też udostępnia tylko metody...

0

Chyba chodzi o to, że interfejs nie zawsze musimy wykorzystać w klasach a klasa abstrakcyjna jest wspolna dla wszystkich tak?

0

@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).

1 użytkowników online, w tym zalogowanych: 0, gości: 1