Con i metodi statici, non esiste alcun oggetto che fornisca il controllo appropriato del meccanismo di override.
Il normale meccanismo del metodo virtuale di classe / istanza consente un controllo finemente ottimizzato delle sostituzioni come segue: ogni oggetto reale è un'istanza di esattamente una classe. Quella classe determina il comportamento degli override; ottiene sempre il primo crack con i metodi virtuali. Può quindi scegliere di chiamare il metodo genitore al momento giusto per la sua implementazione. Quindi, ogni metodo genitore ottiene anche il proprio turno per invocare il suo metodo genitore. Ciò si traduce in una bella cascata di invocazioni dei genitori, che realizza una delle nozioni di riutilizzo del codice per cui è noto l'orientamento dell'oggetto. (Qui il codice di base / super classi viene riutilizzato in un modo relativamente complesso, un'altra nozione ortogonale di riutilizzo del codice in OOP sta semplicemente avendo più oggetti della stessa classe.)
Le classi base possono essere riutilizzate da varie sottoclassi e ciascuna può coesistere comodamente. Ogni classe che viene utilizzata per istanziare oggetti che dettano il proprio comportamento, coesistono pacificamente e simultaneamente con gli altri. Il cliente ha il controllo su quali comportamenti vuole e quando sceglie quale classe utilizzare per creare un'istanza di un oggetto e passare agli altri come desiderato.
(Questo non è un meccanismo perfetto, poiché è sempre possibile identificare le funzionalità che non sono supportate, ovverosia, motivo per cui modelli come il metodo factory e l'iniezione delle dipendenze sono sovrapposti sopra.)
Quindi, se dovessimo fare una funzione di override per la statica senza cambiare altro, avremmo difficoltà ad ordinare gli override. Sarebbe difficile definire un contesto limitato per l'applicabilità dell'override, quindi si otterrebbe l'override a livello globale piuttosto che più localmente come con gli oggetti. Non esiste un oggetto istanza per cambiare il comportamento. Quindi, se qualcuno ha invocato il metodo statico che è stato sovrascritto da un'altra classe, l'override dovrebbe avere il controllo o no? Se ci sono più di questi override, chi prende il controllo per primo? secondo? Con le sovrascritture degli oggetti di esempio, tutte queste domande hanno risposte significative e ben ragionate, ma con la statistica non lo fanno.
Le sostituzioni per la statica sarebbero sostanzialmente caotiche e, cose del genere sono già state fatte prima.
Ad esempio, il sistema Mac OS 7 e precedenti hanno utilizzato un meccanismo di patch trap per estendere il sistema ottenendo il controllo delle chiamate di sistema fatte dall'applicazione prima del sistema operativo. Potresti pensare alla tabella di patch delle chiamate di sistema come a una matrice di puntatori di funzioni, proprio come un vtable per oggetti di istanza, eccetto che era un unico tavolo globale.
Questo ha causato dolore indicibile ai programmatori a causa della natura non ordinata delle patch trap. Alla fine, chi ha toppato la trappola per ultimo ha vinto, anche se non volevano. Ogni patcher del trap catturerebbe il precedente valore trap per una sorta di capacità di chiamata genitore, che era estremamente fragile. Rimuovere una patch trap, dire che non è più necessario conoscere una chiamata di sistema è stata considerata una cattiva forma in quanto non si avevano realmente le informazioni necessarie per rimuovere la patch (se lo facevi, si eliminerebbero anche eventuali altre patch che erano state seguite voi).
Questo non vuol dire che sarebbe impossibile creare un meccanismo per l'override della statica, ma quello che probabilmente preferirei fare invece è trasformare i campi statici e i metodi statici in campi di istanze e metodi di istanza di metaclassi, in modo che si applicherebbero quindi le normali tecniche di orientamento dell'oggetto. Tieni presente che esistono anche sistemi che eseguono questa operazione: CSE 341: Classi Smalltalk e metaclassi ; Vedi anche: Qual è l'equivalente Smalltalk di Java statico?
Sto tentando di dire che dovresti fare un disegno serio delle caratteristiche linguistiche per farlo funzionare anche abbastanza bene. Per un esempio, un approccio ingenuo è stato fatto, è andato zoppicando, ma è stato molto problematico, e probabilmente (vale dire che direi) architettonicamente imperfetto fornendo un'astrazione incompleta e difficile da usare.
Quando hai finito di progettare la funzione di sostituzioni statiche per funzionare correttamente, potresti aver appena inventato una qualche forma di metaclassi, che è un'estensione naturale di OOP in / per i metodi basati su classi. Quindi, non c'è motivo per non farlo - e alcune lingue effettivamente lo fanno. Forse è solo un po 'più di un requisito marginale che un certo numero di lingue sceglie di non fare.