W przypadku metod statycznych nie ma obiektu zapewniającego odpowiednią kontrolę mechanizmu nadpisywania.
Mechanizm wirtualnej metody normalnej klasy / instancji pozwala na precyzyjnie dostrojone sterowanie nadpisywaniem w następujący sposób: każdy rzeczywisty obiekt jest instancją dokładnie jednej klasy. Ta klasa określa zachowanie przesłonięć; zawsze dostaje pierwszy crack przy metodach wirtualnych. Następnie może wybrać wywołanie metody nadrzędnej we właściwym czasie w celu jej implementacji. Następnie każda metoda nadrzędna otrzymuje swoją kolej, aby wywołać metodę nadrzędną. Powoduje to ładną kaskadę wywołań nadrzędnych, która realizuje jedno z pojęć ponownego użycia kodu, z którego znana jest orientacja obiektowa. (W tym przypadku kod bazowy / superklasy są ponownie wykorzystywane w stosunkowo skomplikowany sposób; innym ortogonalnym pojęciem ponownego użycia kodu w OOP jest po prostu posiadanie wielu obiektów tej samej klasy.)
Klasy podstawowe mogą zostać ponownie wykorzystane przez różne podklasy i każda z nich może wygodnie współistnieć. Każda klasa używana do tworzenia obiektów dyktujących własne zachowanie, pokojowo i jednocześnie współistniejących z innymi. Klient ma kontrolę nad tym, jakich zachowań chce i kiedy, wybierając klasę, której ma użyć, aby utworzyć obiekt i przekazać go innym, zgodnie z potrzebami.
(To nie jest doskonały mechanizm, ponieważ zawsze można zidentyfikować funkcje, które nie są obsługiwane, oczywiście, dlatego właśnie wzorce, takie jak metoda fabryczna i wstrzykiwanie zależności, są nakładane na wierzch).
Tak więc, jeśli mielibyśmy zrobić funkcję zastępowania dla statyki bez zmiany czegokolwiek innego, mielibyśmy trudności z zamówieniem przesłonięć. Trudno byłoby zdefiniować ograniczony kontekst dla zastosowania przesłonięcia, więc można byłoby przesłonić globalnie, a nie lokalnie, jak w przypadku obiektów. Nie ma obiektu instancji, który mógłby zmienić zachowanie. Więc jeśli ktoś wywołał metodę statyczną, która została zastąpiona przez inną klasę, to czy zastąpienie powinno uzyskać kontrolę, czy nie? Jeśli istnieje wiele takich zastąpień, kto pierwszy przejmie kontrolę? druga? W przypadku zastąpienia obiektu instancji wszystkie te pytania mają sensowne i dobrze uzasadnione odpowiedzi, ale nie mają ich w przypadku statyki.
Zastąpienia statyki byłyby zasadniczo chaotyczne i takie rzeczy były już wcześniej robione.
Na przykład Mac OS System 7 i wcześniej korzystały z mechanizmu łatania pułapek w celu rozszerzenia systemu poprzez uzyskanie kontroli nad wywołaniami systemowymi wykonywanymi przez aplikację przed systemem operacyjnym. Można by pomyśleć o systemowej tablicy łatek wywołań systemowych jako tablicy wskaźników funkcji, podobnie jak na przykład vtable dla obiektów, z tym wyjątkiem, że była to pojedyncza tabela globalna.
Spowodowało to nieopisany smutek dla programistów z powodu nieuporządkowanej natury łatania pułapek. Ktokolwiek mógł załatać pułapkę, po prostu wygrał, nawet jeśli nie chciał. Każda łata pułapki przechwytywałaby poprzednią wartość pułapki dla pewnego rodzaju możliwości wywołania rodzica, co było wyjątkowo delikatne. Usunięcie łaty pułapkowej, powiedzmy, że kiedy nie musisz już wiedzieć o wywołaniu systemowym, uznano ją za złą formę, ponieważ tak naprawdę nie posiadałeś informacji potrzebnych do usunięcia łatki (gdybyś to zrobił, cofnąłbyś również wszelkie inne łaty, które pojawiły się później ty).
Nie oznacza to, że niemożliwe byłoby stworzenie mechanizmu zastępowania statyki, ale prawdopodobnie wolałbym zamiast tego zmienić pola statyczne i metody statyczne w pola instancji i metody instancji metaklas, tak aby normalny obiekt Zastosowanie miałyby wówczas techniki orientacji. Zauważ, że istnieją również systemy, które to robią: CSE 341: klasy i metaklasy Smalltalk ; Zobacz także: Co to jest odpowiednik Smalltalk w statyce Java?
Próbuję powiedzieć, że musiałbyś zrobić poważny projekt funkcji językowych, aby działał nawet w miarę dobrze. Na przykład zastosowano podejście naiwne, utykało, ale było bardzo problematyczne i prawdopodobnie (tj. Argumentowałbym) architektonicznie wadliwe, zapewniając niepełną i trudną do użycia abstrakcję.
Zanim skończysz projektować funkcję przesłonięć statycznych tak, aby działała dobrze, być może wymyśliłeś jakąś formę metaklasy, która jest naturalnym rozszerzeniem OOP na metody klasowe. Nie ma więc powodu, aby tego nie robić - a niektóre języki faktycznie tak robią. Być może jest to tylko trochę dodatkowy wymóg, że wiele języków decyduje się tego nie robić.
self
wskaźnik, który wskazuje na klasę, a nie na instancję klasy.