Tu nie chodzi stricte o wymuszanie czegoś, a bardziej o to, że na wysokim poziomie chcesz np zaimplementować pewną wspólną metodę, ale ta metoda wykorzystuje funkcjonalności, które trzeba zaimplementować dopiero w klasach pochodnych.
Taki przykład z czapy:
Klasa bazowa abstrakcyjna Samochód ma właściwość limitWagowy, metodę abstrakcyjną policzWagę, oraz metodę nieabstrakcyjną czyPrzekroczonoLimitWagowy, która korzysta z tej wcześniejszej. Dzięki temu, że metoda policzWagę jest w klasie Samochód, to można wrzucić metodę czyPrzekroczonoLimitWagowy do klasy Samochód, zamiast kopiować ją do wszystkich podklas. Natomiast klasa Samochód nie wie jak policzyć wagę każdego konkretnego rodzaju samochodu, więc deleguje tą odpowiedzialność do podklas poprzez stworzenie abstrakcyjnej metody policzWagę.
Można by to rozwiązywać na inne sposoby, np tworząc interfejs LicznikWagi i przekazywać go do metody czyPrzekroczonoLimitWagowy i wszystkich innych metod potrzebujących wagi, ale to by wymagało dużo większego nakładu pracy, a zarazem byłoby najprawdopodobniej niepotrzebne skoro mamy metody abstrakcyjne.
Jedna z ogólnych zasad przy projektowaniu nietrywialnych aplikacji to to, że klasa bazowa nie może wiedzieć o bebechach klas dziedziczących. A więc nie powinno się np robić nieabstrakcyjnej metody policzWagę w klasie Samochód, która by miała logikę dla wszystkich swoich podklas.