Com os métodos estáticos, não há objeto para fornecer o controle adequado do mecanismo de substituição.
O mecanismo normal do método virtual de classe / instância permite o controle preciso de substituições da seguinte maneira: cada objeto real é uma instância de exatamente uma classe. Essa classe determina o comportamento das substituições; sempre obtém o primeiro acesso aos métodos virtuais. Em seguida, ele pode optar por chamar o método pai no momento certo para sua implementação. Cada método pai também recebe sua vez de chamar seu método pai. Isso resulta em uma bela cascata de invocações pai, que realiza uma das noções de reutilização de código pelas quais a orientação a objetos é conhecida. (Aqui o código das classes base / superclasses está sendo reutilizado de uma maneira relativamente complexa; outra noção ortogonal de reutilização de código no OOP é simplesmente ter vários objetos da mesma classe.)
As classes base podem ser reutilizadas por várias subclasses e cada uma pode coexistir confortavelmente. Cada classe usada para instanciar objetos ditando seu próprio comportamento, coexistindo pacificamente e simultaneamente com as outras. O cliente tem controle sobre quais comportamentos deseja e quando, escolhendo qual classe usar para instanciar um objeto e repassar para outras pessoas, conforme desejado.
(Este não é um mecanismo perfeito, pois sempre é possível identificar recursos que não são suportados, é por isso que é por isso que padrões como o método de fábrica e a injeção de dependência são colocados em camadas)
Portanto, se tivéssemos um recurso de substituição de estática sem alterar mais nada, teríamos dificuldade em ordenar as substituições. Seria difícil definir um contexto limitado para a aplicabilidade da substituição, portanto, você obteria a substituição globalmente, e não localmente, como nos objetos. Não há objeto de instância para alterar o comportamento. Portanto, se alguém invocou o método estático que foi substituído por outra classe, a substituição deve ter controle ou não? Se houver várias substituições, quem obtém o controle primeiro? segundo? Com a substituição de objetos de instância, todas essas perguntas têm respostas significativas e bem fundamentadas, mas com estática elas não.
Substituições de estática seriam substancialmente caóticas e, coisas como essa já foram feitas antes.
Por exemplo, o Mac OS System 7 e versões anteriores usavam um mecanismo de correção de traps para estender o sistema, obtendo o controle das chamadas do sistema feitas pelo aplicativo antes do sistema operacional. Você poderia pensar em tabela de correção a chamada de sistema como uma matriz de ponteiros de função, bem como uma vtable para objetos de instância, exceto que ele era uma única tabela global.
Isso causou um sofrimento incalculável para os programadores, devido à natureza não ordenada da correção de armadilhas. Quem conseguiu consertar a armadilha venceu basicamente, mesmo que não quisesse. Cada corretor da armadilha capturaria o valor anterior da armadilha para um tipo de recurso de chamada pai, que era extremamente frágil. A remoção de um patch de interceptação, digamos que, quando você não precisava mais saber sobre uma chamada de sistema, era considerada péssima, porque na verdade não tinha as informações necessárias para remover o patch (se o fizesse, também desataria outros patches que se seguiram). você).
Isso não quer dizer que seria impossível criar um mecanismo para substituições de estática, mas o que eu provavelmente preferiria fazer é transformar os campos estáticos e métodos estáticos em campos de instâncias e métodos de metaclasses, para que o objeto normal técnicas de orientação seriam aplicadas. Observe que existem sistemas que fazem isso também: CSE 341: Classes e metaclasses de Smalltalk ; Veja também: Qual é o equivalente do Smalltalk à estática do Java?
Estou tentando dizer que você precisaria criar um design sério de recurso de linguagem para fazê-lo funcionar razoavelmente bem. Por exemplo, uma abordagem ingênua foi feita, mancou, mas era muito problemática e, sem dúvida (eu diria), com falhas arquiteturais, fornecendo uma abstração incompleta e difícil de usar.
Quando você terminar de projetar o recurso de substituições estáticas para funcionar bem, você poderá ter inventado alguma forma de metaclasses, que é uma extensão natural do OOP para / para métodos baseados em classes. Portanto, não há razão para não fazer isso - e alguns idiomas realmente fazem. Talvez seja apenas um requisito adicional que vários idiomas optem por não fazer.
self
ponteiro que aponta para a classe e não para uma instância da classe.