Bei den statischen Methoden besteht keine Aufgabe darin, den Übersteuerungsmechanismus ordnungsgemäß zu steuern.
Der Mechanismus der normalen virtuellen Klasse / Instanz-Methode ermöglicht die fein abgestimmte Steuerung von Überschreibungen wie folgt: Jedes reale Objekt ist eine Instanz von genau einer Klasse. Diese Klasse bestimmt das Verhalten der Überschreibungen. es bekommt immer den ersten Riss bei virtuellen Methoden. Sie kann dann die übergeordnete Methode zum richtigen Zeitpunkt für die Implementierung aufrufen. Jede übergeordnete Methode ruft dann auch ihre übergeordnete Methode auf. Dies führt zu einer Kaskade von übergeordneten Aufrufen, die einen der Begriffe der Wiederverwendung von Code erfüllt, für den die Objektorientierung bekannt ist. (Hier wird der Code der Basis- / Superklasse in relativ komplexer Weise wiederverwendet. Ein weiterer orthogonaler Begriff der Wiederverwendung von Code in OOP besteht darin, einfach mehrere Objekte derselben Klasse zu haben.)
Basisklassen können von verschiedenen Unterklassen wiederverwendet werden und jede kann problemlos koexistieren. Jede Klasse, die verwendet wird, um Objekte zu instanziieren, die ihr eigenes Verhalten diktieren, friedlich und gleichzeitig mit den anderen koexistieren. Der Client hat die Kontrolle darüber, welches Verhalten er wann haben möchte, indem er wählt, mit welcher Klasse ein Objekt instanziiert und wie gewünscht an andere weitergegeben wird.
(Dies ist kein perfekter Mechanismus, da man natürlich immer Fähigkeiten identifizieren kann, die nicht unterstützt werden, weshalb Muster wie die Factory-Methode und die Abhängigkeitsinjektion überlagert sind.)
Wenn wir also eine Override-Funktion für die Statik erstellen würden, ohne etwas anderes zu ändern, hätten wir Schwierigkeiten, die Overrides zu bestellen. Es ist schwierig, einen begrenzten Kontext für die Anwendbarkeit der Außerkraftsetzung zu definieren, sodass die Außerkraftsetzung eher global als lokal wie bei Objekten erfolgt. Es gibt kein Instanzobjekt, um das Verhalten zu ändern. Wenn also jemand die statische Methode aufgerufen hat, die zufällig von einer anderen Klasse überschrieben wurde, sollte die Überschreibung dann die Kontrolle erhalten oder nicht? Wenn es mehrere solcher Überschreibungen gibt, wer erhält zuerst die Kontrolle? zweite? Bei Überschreibungen von Instanzobjekten haben diese Fragen alle sinnvolle und gut begründete Antworten, bei statischen Fragen jedoch nicht.
Überschreibungen für Statik wären im Wesentlichen chaotisch, und solche Vorgänge wurden bereits durchgeführt.
Beispielsweise verwendeten das Mac OS System 7 und frühere Versionen einen Trap-Patch-Mechanismus, um das System zu erweitern, indem die Kontrolle über von Anwendungen ausgeführte Systemaufrufe vor dem Betriebssystem erlangt wurde. Sie können sich die Systemaufruf-Patch-Tabelle als ein Array von Funktionszeigern vorstellen , ähnlich einer vtable für Instanzobjekte , mit der Ausnahme, dass es sich um eine einzelne globale Tabelle handelt.
Dies verursachte den Programmierern aufgrund der ungeordneten Art des Trap-Patches ungeahnten Kummer. Wer zuletzt die Falle flicken musste, gewann im Grunde genommen, auch wenn er es nicht wollte. Jeder Patcher des Traps erfasste den vorherigen Trap-Wert für eine Art übergeordneter Aufruffunktion, die äußerst zerbrechlich war. Das Entfernen eines Trap-Patches, wenn Sie nicht mehr über einen Systemaufruf Bescheid wissen mussten, wurde als fehlerhaft eingestuft, da Sie nicht über die erforderlichen Informationen zum Entfernen Ihres Patches verfügten Sie).
Dies soll nicht heißen, dass es unmöglich wäre, einen Mechanismus zum Überschreiben von Statik zu erstellen, aber ich würde es wahrscheinlich vorziehen, stattdessen die statischen Felder und statischen Methoden in Instanzfelder und Instanzmethoden von Metaklassen umzuwandeln, so dass das normale Objekt Dann würden Orientierungstechniken angewendet. Beachten Sie, dass es auch Systeme gibt, die dies tun: CSE 341: Smalltalk-Klassen und Metaklassen ; Siehe auch: Was ist das Smalltalk-Äquivalent der Java-Statik?
Ich versuche zu sagen, dass Sie einige ernsthafte Sprachfeatures entwerfen müssten, damit es auch einigermaßen gut funktioniert. Zum Beispiel wurde eine naive Herangehensweise unternommen, die hinkte, aber sehr problematisch war und möglicherweise (dh ich würde argumentieren) architektonisch fehlerhaft war, indem eine unvollständige und schwer zu verwendende Abstraktion bereitgestellt wurde.
Wenn Sie mit dem Entwerfen der Funktion für statische Überschreibungen fertig sind, haben Sie möglicherweise gerade eine Form von Metaklassen erfunden, die eine natürliche Erweiterung von OOP in / für klassenbasierte Methoden darstellt. Es gibt also keinen Grund, dies nicht zu tun - und einige Sprachen tun dies tatsächlich. Vielleicht ist es nur eine Randbedingung, dass eine Reihe von Sprachen dies nicht tun.
self
Zeiger, der auf die Klasse und nicht auf eine Instanz der Klasse verweist.