Dziedziczenie. Nowa klasa dziedzicząc po poprzedniej otrzymuje pełny jej zestaw pól i metod (z wyjątkiem oczywiście prywatnych). Nowa klasa jest niejako rozszerzeniem innej.
Przykład:
Klasa bazowa - UrządzenieElektryczne. Ma metody wlacz(), wylacz(). Stwórzmy teraz klasę pochodną, niech będzie to czajnik elektryczny. Dziedziczy metody wlacz() i wylacz(), a oprócz tego dodajemy mu metodę zagrzejWode().
Zalety/wady:
Unikamy zbędnego programowania w stylu kopiuj/wklej. Przejrzystość kodu. Możemy użyć polimorfizmu. Niestety dziedziczyć można na raz jedynie z jednej klasy. Dlatego lepszym wyborem zazwyczaj są interfejsy.
Delegacja/kolekcja: Tutaj bardzo łatwo opisać to na przykładzie.
Przykład:
Klasą bazową niech będzie ekwipunek postaci w grze RPG. Nie możemy tu przecież dziedziczyć po klasach Zbroja, Miecz, czy Tarcza. Możemy za to stworzyć kolekcję. W klasie Ekwipunek umieszczamy pola klas Miecz, Zbroja, Tarcza. Następnie odwołujemy się (delegujemy) do nich, na przykład nazwaMiecza.atakuj().
Korzyści/wady:
Bardzo wygodne zastosowanie OOP. Łatwość i czytelność kodu. Czasami niestety klasy tworzone są nieprzemyślanie i cały ten mechanizm nie wygląda zbyt przejrzyście.
Podsumowując, jeśli nie wiesz czego w danym przypadku użyć, prawdopodobnie lepiej gdy użyjesz kolekcji. Niektórzy doświadczeni programiści dziedziczenie we współczesnym programowaniu uznają za błąd i opierają całą strukturę programu na interfejsach, jednak nie sugeruj się tym na razie. Wybacz, że nie dawałem przykładów z kodu, tylko opisowo, jednak nie mam tutaj IDE, a forumowy edytor nie supportuje wcięć.