Nie rozumiem pytania. Mam na przykład 3 klasy, z jakąśtam implementacją. Klasa bazowa ma "wspólne" właściwości takie jak ścieżka do pliku, otwieranie pliku i wczytywanie surowych danych. Dziedziczące klasy dodatkowo wykonują parsowanie danych zgodnie ze swoim typem (czyli CSV albo XML).
class GenericInputFileReader{}
class XMLInputFileReader extends GenericInputFileReader{}
class CSVInputFileReader extends GenericInputFileReader{}
Mam teraz jakiś kod w programie:
GenericInputFileReader fileReader = getFileReader();
FileContents contents = fileReader.readFile(ścieżka);
Zauważ że w tym kodzie metoda getFileReader()
może nam zwrócić obiekt dowolnej z tych 3 klas, ale kodu nie będę musiał nigdzie zmieniać. Co wiecej mogę jutro dopisać sobie nową klasę, która czyta jeszcze inne pliki, a następnie będę musiał tą nową klasę uwzględnić tylko w metodzie getFileReader
bo cała reszta kodu pozostaje bez zmian.
Dziedziczenie pozwala mi tu również na nie powtarzanie tego samego kodu 3 razy. Bo otwarcie pliku i wczytanie zawartości w każdej sytuacji wygląda identycznie, jedyna różnica jest taka że "parsowanie" danych wykonuje jakieś transformacje albo po prostu wypluwa treść pliku. Wygodniej więc zamknąć tą "wspólną" logikę w jednej klasie. Szczególnie że może się okazać że coś jeszcze musimy zrobić w trakcie czytania pliku i wtedy musimy to dopisać tylko w 1 miejscu a nie w 3 (albo 50).