Witam, zdaje sobie sprawę, że to pytanie pojawiało się tutaj już kilka razy, ale potrzebuje prostej, łopatologicznej odpowiedzi na pytania: Czym sa interfejsy, jak je rozumiem, do czego są i jak są stosowane ?
Interfejsy to po prostu zbiór deklaracji, co klasa implementująca ów interfejs musi zawierać.
Stosuje je się praktycznie wszędzie do wydzielania wspólnej warstwy abstrakcji. Przykład:
Bez interfejsów:
class IntValueClassA {
int getValue(){
return -1;
}
}
class IntValueClassB {
int getValue(){
return 1;
}
}
public int sumValues(IntValueClassA a, IntValueClassB b){
return a.getValue() + b.getValue();
}
public void test(){
IntValueClassA a = new IntValueClassA();
IntValueClassB b = new IntValueClassB();
sumValues(a, b); // zadziała
sumValues(a, a); // błąd kompilacji - bo a jest innej klasy niż IntValueClassB
sumValues(b, a); // błąd kompilacji
sumValues(b, b); // błąd kompilacji
}
Żeby to ogarnąć to trzeba by dopisać jeszcze trzy razy sumValues - dla (IntValueClassA, IntValueClassA), (IntValueClassB, IntValueClassB) itp. A co jeśli dorzucisz IntValueClassC?
Teraz z interfejsami:
interface IntValue {
int getValue();
}
class IntValueClassA implements IntValue {
int getValue(){
return -1;
}
}
class IntValueClassB implements IntValue {
int getValue(){
return 1;
}
}
public int sumValues(IntValue a, IntValue b){
return a.getValue() + b.getValue();
}
public void test(){
IntValueClassA a = new IntValueClassA();
IntValueClassB b = new IntValueClassB();
sumValues(a, b); // zadziała
sumValues(a, a); // zadziała
sumValues(b, a); // zadziała
sumValues(b, b); // zadziała
}
I kiedy chcesz dorzucić jeszcze jedną klasę IntValueClassC to po prostu implementujesz IntValue i działa.
Oczywiście to jest dosyć prosty przykład.
Warto zajrzeć do książki Effective Java 2nd edition (rozdział 4 classes and interfaces).
Poczytaj o:
- interfejsach markerach (np. czy dana klasa jest serializowana czy nie)
- poliformiźmie (który jest zwykle implementowany przy użyciu interfejsów): czyli różne implementacje tego samego obiektu
- o nowościach w Javie 8: domyślnych metodach
- jak zaimplementować strategię (np. z użyciem interfejsów :) )
ogólnie to: interfejs opisuje, jakie zachowania ma klasa, która go implementuje. niektórzy nazywają to protokołem ale tutaj raczej byłbym ostrożny
mam nadzieje ze pomoglem xD