Nowe posty

Autor Wątek: Interface - a na co to?  (Przeczytany 4531 razy)

goscccccccccccc

  • Gość
Interface - a na co to?
« dnia: 2009-04-09, 22:07:42 »
"Interfejs klasy — w obiektowych językach programowania interfejs jest abstrakcyjną reprezentacją klasy pozwalającą na korzystanie z niej niezależnie od faktycznej implementacji. Interfejs pozwala na enkapsulację wielu różnych obiektów utworzonych w oparciu o odmienne klasy, które zawierają implementację wspólnego interfejsu. W języku C++ interfejs może być zdefiniowany jako klasa abstrakcyjna. W Javie, C#, Object Pascalu oraz PHP stosuje się w tym celu specjalną deklarację ze słowem interface."

źródło: wikipedia


Czytałem tez opisy w książkach w tutorialu Javy na stronach Sun Microsystems, ale jakoś nie rozumiem idei interfejsów. Może pracowałem w zapyziałych firmach, może tworzę zapyziały kod, ale nigdy nie stosowałem interfejsów i nie rozumiem po co to stosować. Różne abstrakcyjne upierdliwości, to jeszcze rozumiem, bo dzięki temu kod projektów był bardziej spójny i przewidywalny, ale interfejsów нет.

Ktoś może mnie olśnić jakimś prostym językiem popartym przykładami?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3059
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Interface - a na co to?
« Odpowiedź #1 dnia: 2009-04-10, 08:22:41 »
1. Interfejs jest odpowiednikiem klasy czysto abstrakcyjnej (czyli mającej wszystkie metody abstrakcyjne).

2. W hierarchii klas Javy można dziedziczyć po jednej klasie (dziedziczenie jednobazowe), ale implementować dowolnie wiele interfejsów. Interfejsy powstały m.in. jako rozwiązanie problemu dziedziczenia wielobazowego, gdy w dwóch klasach bazowych istnieją dwie różne implementacje tej samej funkcji. Którą wciągnąć do klasy pochodnej, itd.

3. Intefejs (jak nazwa wskazuje) Mówi co klasa może robić, nie jak. Przykładem klasycznym jest interfejs Iterable: zobowiązuje on autora podklasy  do zaimplementowania funkcji iterator(). Każda klasa implementująca Iterable automatycznie zachowuje się jak kolekacja - można stosować ją np. w pętli foreach. I dla autora klasy korzystającej z twojej klasy nie ma znaczenia co twoja klasa robi - może nawet po prostu zwracać kolejne liczby całkowite czy ciągle napis "dupa".

Generalnie deklaracja implementacji interfejsu w klasie jest kontraktem dla autora zobowiązującym go do tago, żeby klasa zachowywała się zgodnie z dokumentacją implementowanego interfejsu. W zamian jego klasa może byc użyta wszędzie tam, gdzie wystarczy posiadanie kontraktu. Przykład:

Robisz funkcję liczącą elementy w dowolnej kolekcji. Znakomita większość kolekcji implementuje właśnie 'Iterable':
public int policz(Iterable kolekcja)
{
  int s = 0;
  // Istnienie, konkretne parametry i konkretny typ zwracanej wartości tej funkcji
  // jest zagwarantowane właśnie przez interfejs Iterable.
  Iterator i = kolekcja.iterator();
  while(i.hasNext())
  {
   s++;
   i.next();
  }
  return s;
}
Twoja funkcja zadziała prawidłowo zawsze, gdy zostanie nakarmiona wartością implementującą Iterable. Nieważne, czy to coś już istnieje, czy zostanie dopiero napisane - byle zawierało funkcję Iterator iterator() {...}.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy