Jako, że teraz piszę sobie mały programik do szachów to mogę Ci dać przykład rzeczywistego tego użycia (mam nadzieję, że jest dobry):
Mamy klasę ChessGame która jak nazwa wskazuje obsługuję grę w szachy. No i teraz pojawia się mały problem - ChessGame musi mieć w sobie 'graczy' którzy wykonują ruch.
A więc mamy klasę Player która posiada metodę Move() i zwraca jakąś klasę posiadająca pola które zawierają jaki ruch został wykonany. No i teraz jest mały problem. Bo co się dzieje kiedy graczy jest więcej niż jeden rodzaj ?
Dla przykładu: Jeżeli graczem jest człowiek metoda Move() będzie pobierała to, jaki użytkownik wykonał ruch. Jeżeli natomiast graczem jest silnik szachowy to metoda Move() będzie zwracała przeparsowany ruch od silnika szachowego. A więc z klasy Player możemy mieć klasy : CPUPlayer HumanPlayer i każda z nich będzie posiadała metodę Move().
Teraz wracając do klasy ChessGame - ją nie obchodzi jaki dokładnie typ ma Player (Human czy CPU) tylko ją obchodzi to, aby można było wywołać Move() i odpowiednio to obsłużyć więc obchodzi ją tylko typ bazowy Player który posiada Move() i go wywołuje a to jak jest to zaimplementowane pozostaje nieistotne z punktu widzenia ChessGame.
Mam nadzieję, że chociaż trochę jest to bardziej jasne.
Pozdr.