Zależy to od miejsca, w którym stoisz w cyklu programowania, ale czasami szkicując algorytm, chcesz dokonać abstrakcji na temat złożonych bloków bez ich natychmiastowego wdrożenia.
def full_algo():
init_stuff()
process_stuff()
...
Wiesz, jak init_stuff
będzie działać, jest to dość proste w twojej głowie, ale tak naprawdę nie potrzebujesz go od razu, więc deklarujesz, że jest to pusta funkcja. Pozwoli to twojemu kodowi na kompilację i uruchomienie bez zawracania sobie głowy krwawymi szczegółami.
Kolejnym zastosowaniem zwolnionych aplikacji jest dziedziczenie. Załóżmy, że masz dużą klasę, która określa zachowanie kodu specyficznego dla platformy. Może pojawić się logika podobna do tej:
init_filesystem();
access_files();
release_filesystem();
Ten kod będzie działał na wielu platformach, ale niektóre platformy mogą nie wymagać inicjalizacji systemu plików. Wtedy twoje dziedzictwo będzie wyglądać tak (wirtualny z = 0 w C ++ oznacza po prostu, że klasy pochodne MUSZĄ implementować te metody):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
Wówczas określona implementacja tej klasy (interfejsu) może nic nie zrobić dla niektórych z tych metod. Alternatywnie, klasa podstawowa mogłaby zadeklarować puste metody dla init / release zamiast deklarować je jako wirtualne.
Wreszcie (i wstyd) czasami utrzymujesz bardzo starą aplikację. Boisz się, że usunięcie metod spowoduje uszkodzenie. Dzieje się tak, gdy masz złożone dziedziczenie, które nie jest właściwie zrozumiane lub gdy masz wiele wskaźników funkcji (wywołania zwrotne). Po prostu usuwasz w nich kod, aby i tak były wywoływane, nie niszcząc niczego.