Wyobraźmy sobie, że mamy jakąś osobę, której chcemy wręczyć łapówkę. Niestety nasza klasa definiująca osobę nie posiada funkcji służącej do wręczania łapówek:
public class Osoba { }
Rozbudujmy więc naszą klasę (polskie znaki zostały użyte w celu podniesienia przejrzystości kodu):
public class Osoba {
void dajWŁapę(int kwota) { }
}
Okej... Chwilkę, przecież nie wszystkie osoby muszą być od razu skorumpowne...
Tada! Tak już lepiej. No nie zupełnie... Rokita* mógłby się obrazić (*edit: pisane w 2005 roku...).
public class Polityk extends Osoba {
void dajWŁapę(int kwota) { }
}
Teraz chyba wszystko jest już w porządku:
public class SkorumpowanyPolityk extends Polityk {
void dajWŁapę(int kwota) { }
}
Taaa... A co z urzędnikami, lekarzami, etc? Wszyscy biorą w ten sam sposób. Trzeba zdefiniować wspólną metodę (interfejs). Oto nasz "sposób" na wręczanie łapówek dla wszystkich skorumpowanych osób:
public interface Skorumpowany {
void dajWŁapę(int kwota);
}
1. Teraz możemy wziąć dowolną osobę:
Osoba jakaśOsoba = ...
2. Sprawdzić, czy jest skorumpowana:
if (jakaśOsoba instanceof Skorumpowany)
3. I w końcu wręczyć łapówkę:
Skorumpowany.class.cast(jakaśOsoba).dajWŁapę(1000); // Java 5.0 i nowsza
((Skorumpowany)jakaśOsoba).dajWŁapę(1000); // Java starsza niż 5.0
4. A nasza nowa klasa opisująca skorumpowanego polityka, wygląda tak:
public class SkorumpowanyPolityk extends Polityk implements Skorumpowany {
void dajWŁapę(int kwota) { }
}
A to przykładowy algorytm zamykający wszystkie skorumpowane osoby w Polsce ;-)
for (Osoba osoba : wszyscyMieszkańcyPolski) {
if ((osoba instanceof Skorumpowany) && !(osoba instanceof Immunitet))
doPaki(osoba);
}