Con i metodi statici, non esiste alcun oggetto che fornisca il controllo adeguato del meccanismo di override.
Il normale meccanismo del metodo virtuale di classe / istanza consente un controllo finemente regolato delle sostituzioni come segue: ogni oggetto reale è un'istanza esattamente di una classe. Quella classe determina il comportamento delle sostituzioni; ottiene sempre il primo crack nei metodi virtuali. Può quindi scegliere di chiamare il metodo parent al momento giusto per la sua implementazione. Ogni metodo genitore quindi ottiene anche il suo turno per invocare il suo metodo genitore. Ciò si traduce in una bella cascata di invocazioni padre, che compie una delle nozioni di riutilizzo del codice per cui è noto l'orientamento agli oggetti. (Qui il codice delle classi base / super viene riutilizzato in un modo relativamente complesso; un'altra nozione ortogonale di riutilizzo del codice in OOP è semplicemente avere più oggetti della stessa classe.)
Le classi di base possono essere riutilizzate da varie sottoclassi e ognuna può coesistere comodamente. Ogni classe utilizzata per creare un'istanza di oggetti dettando il proprio comportamento, coesistendo pacificamente e contemporaneamente con gli altri. Il cliente ha il controllo su quali comportamenti desidera e quando scegliendo quale classe utilizzare per creare un'istanza di un oggetto e passare ad altri come desiderato.
(Questo non è un meccanismo perfetto, in quanto si possono sempre identificare capacità che non sono supportate, ovviamente, motivo per cui modelli come il metodo di fabbrica e l'iniezione di dipendenza sono sovrapposti.)
Quindi, se dovessimo creare una capacità di override per la statica senza cambiare nient'altro, avremmo difficoltà a ordinare le sostituzioni. Sarebbe difficile definire un contesto limitato per l'applicabilità dell'override, quindi otterresti l'override a livello globale piuttosto che più localmente come con gli oggetti. Non esiste alcun oggetto di istanza per cambiare il comportamento. Quindi, se qualcuno invocasse il metodo statico che era capitato di essere sostituito da un'altra classe, l'override dovrebbe ottenere il controllo o no? Se sono presenti più sostituzioni, chi ottiene il controllo per primo? secondo? Con l'override dell'oggetto di istanza, tutte queste domande hanno risposte significative e ben motivate, ma con la statica no.
Le sostituzioni per la statica sarebbero sostanzialmente caotiche e cose del genere sono state già fatte in precedenza.
Ad esempio, Mac OS System 7 e precedenti utilizzavano un meccanismo di patch trap per estendere il sistema ottenendo il controllo delle chiamate di sistema effettuate dall'applicazione prima del sistema operativo. Si potrebbe pensare alla tabella delle patch delle chiamate di sistema come a una matrice di puntatori a funzioni, proprio come una vtable per gli oggetti di esempio, tranne per il fatto che si trattava di una singola tabella globale.
Ciò ha causato un dolore indicibile ai programmatori a causa della natura non ordinata del patch trap. Chiunque fosse riuscito a rattoppare l'ultima trappola in pratica ha vinto, anche se non voleva. Ogni patcher della trap catturerebbe il valore trap precedente per una sorta di capacità di chiamata parent, che era estremamente fragile. Rimuovendo una patch trap, dire che quando non si aveva più bisogno di sapere di una chiamata di sistema era considerata una forma errata poiché non si disponevano delle informazioni necessarie per rimuovere la patch (se lo si facesse, si sbloccherebbe anche qualsiasi altra patch seguita voi).
Questo non vuol dire che sarebbe impossibile creare un meccanismo per l'override della statica, ma ciò che probabilmente preferirei fare è invece trasformare i campi statici e i metodi statici in campi di istanze e metodi di istanza di metaclasse, in modo che l'oggetto normale sarebbero quindi applicabili le tecniche di orientamento. Si noti che esistono anche sistemi che fanno questo: CSE 341: classi e metaclassi Smalltalk ; Vedi anche: Qual è l'equivalente Smalltalk dell'elettricità statica di Java?
Sto cercando di dire che dovresti fare qualche seria progettazione delle caratteristiche del linguaggio per farlo funzionare anche ragionevolmente bene. Per un esempio, è stato adottato un approccio ingenuo, che ha zoppicato, ma è stato molto problematico e probabilmente (cioè direi che) sia stato difettoso dal punto di vista architettonico fornendo un'astrazione incompleta e difficile da usare.
Quando hai finito di progettare la funzionalità di sostituzione statica per funzionare correttamente, potresti aver appena inventato una qualche forma di metaclasse, che è un'estensione naturale di OOP in / per metodi basati su classi. Quindi, non c'è motivo di non farlo - e alcune lingue lo fanno davvero. Forse è solo un po 'più un requisito marginale che un certo numero di lingue scelgono di non farlo.
self
puntatore che punta alla classe e non a un'istanza della classe.