Con los métodos estáticos, no hay ningún objeto para proporcionar un control adecuado del mecanismo de anulación.
El mecanismo de método virtual de clase / instancia normal permite un control finamente ajustado de las anulaciones de la siguiente manera: cada objeto real es una instancia de exactamente una clase. Esa clase determina el comportamiento de las anulaciones; siempre tiene la primera grieta en los métodos virtuales. Luego puede elegir llamar al método padre en el momento adecuado para su implementación. Cada método padre también tiene su turno para invocar su método padre. Esto da como resultado una buena cascada de invocaciones de padres, que cumple una de las nociones de reutilización de código por la que se conoce la orientación a objetos. (Aquí el código de las clases base / súper se está reutilizando de una manera relativamente compleja; otra noción ortogonal de reutilización de código en OOP es simplemente tener múltiples objetos de la misma clase).
Varias subclases pueden reutilizar las clases base, y cada una puede coexistir cómodamente. Cada clase que se usa para instanciar objetos dictando su propio comportamiento, coexistiendo pacíficamente y simultáneamente con los demás. El cliente tiene control sobre qué comportamientos quiere y cuándo elige qué clase usar para crear una instancia de un objeto y pasarlo a otros según lo desee.
(Este no es un mecanismo perfecto, ya que uno siempre puede identificar capacidades que no son compatibles, por supuesto, por eso los patrones como el método de fábrica y la inyección de dependencia se superponen en capas).
Entonces, si tuviéramos que hacer una capacidad de anulación para las estadísticas sin cambiar nada más, tendríamos dificultades para ordenar las anulaciones. Sería difícil definir un contexto limitado para la aplicabilidad de la anulación, por lo que obtendría la anulación globalmente en lugar de más localmente como con los objetos. No hay objeto de instancia para cambiar el comportamiento. Entonces, si alguien invocó el método estático que fue reemplazado por otra clase, ¿la anulación debería tener control o no? Si hay varias anulaciones de este tipo, ¿quién obtiene el control primero? ¿segundo? Con la anulación de objetos de instancia, todas estas preguntas tienen respuestas significativas y bien razonadas, pero con estática no.
Las anulaciones para la estática serían sustancialmente caóticas, y cosas como esta se han hecho antes.
Por ejemplo, Mac OS System 7 y anteriores usaban un mecanismo de parcheo de trampa para extender el sistema al obtener el control de las llamadas al sistema hechas por la aplicación antes que el sistema operativo. Podría pensar en la tabla de parches de llamadas del sistema como una matriz de punteros de función, muy parecida a una vtable para objetos de ejemplo, excepto que era una sola tabla global.
Esto causó un dolor incalculable para los programadores debido a la naturaleza desordenada de los parches de trampa. El que parche la trampa al final básicamente ganó, incluso si no quisieron. Cada parcheador de la captura capturaría el valor de la trampa anterior para una especie de capacidad de llamada principal, que era extremadamente frágil. Eliminar un parche de trampa, por ejemplo, cuando ya no necesita saber sobre una llamada al sistema se consideró una mala forma, ya que realmente no tenía la información necesaria para eliminar su parche (si lo hiciera, también quitaría el parche de cualquier otro parche que hubiera seguido tú).
Esto no quiere decir que sería imposible crear un mecanismo para anular las estadísticas, pero lo que probablemente preferiría hacer es convertir los campos estáticos y los métodos estáticos en campos de instancias y métodos de instancias de metaclases, de modo que el objeto normal entonces se aplicarían técnicas de orientación. Tenga en cuenta que también hay sistemas que hacen esto: CSE 341: clases y metaclases de Smalltalk ; Ver también: ¿Cuál es el equivalente de Smalltalk de la estática de Java?
Estoy tratando de decir que tendrías que hacer un diseño de características de lenguaje serio para que funcione incluso razonablemente bien. Por ejemplo, se hizo un enfoque ingenuo, cojeó, pero fue muy problemático y podría decirse (es decir, argumentaría) que tenía fallas arquitectónicas al proporcionar una abstracción incompleta y difícil de usar.
Cuando haya terminado de diseñar la función de anulaciones estáticas para que funcione bien, es posible que haya inventado alguna forma de metaclases, que es una extensión natural de OOP en / para métodos basados en clases. Entonces, no hay razón para no hacer esto, y algunos idiomas realmente lo hacen. Tal vez es solo un requisito adicional que varios idiomas eligen no hacer.
self
puntero que apunta a la clase y no a una instancia de la clase.