Solo para comparar, echemos un vistazo a un lenguaje que no impone una sola clase raíz - Objetivo -DO. En la mayoría de los entornos de Objective-C habrá tres clases de raíz disponibles (Object
, NSObject
y NSProxy
), y puede escribir su propia clase de raíz simplemente no declarando una superclase. De hecho, Object
está en desuso y solo existe por razones heredadas, pero es informativo incluirlo en esta discusión. El lenguaje está escrito en pato, por lo que puede declarar el tipo de una variable como "cualquier objeto antiguo" (escrito como id
), entonces ni siquiera importa qué clase de raíz tiene.
Bien, entonces tenemos todas estas clases base. De hecho, incluso para que el compilador y las bibliotecas de tiempo de ejecución puedan llegar a algún lugar, necesitan un comportamiento común: las clases raíz deben tener un puntero ivar llamado isa
que haga referencia a una estructura de definición de clase. Sin ese puntero, el compilador no sabe cómo crear una estructura de objeto, y la biblioteca de tiempo de ejecución no sabrá cómo averiguar qué clase es un objeto, cuáles son sus variables de instancia, a qué mensajes responde y demás.
Así, aunque Objective-C afirma tener múltiples clases de raíz, de hecho hay un comportamiento que deben implementar todos los objetos. Entonces, en todo menos en el nombre, existe realmente una superclase primitiva común, aunque una con menos API que java.lang.Object
.
N.B. como ocurre, tanto NSObject
como NSProxy
proporcionan una API enriquecida similar a java.lang.Object
, a través de un protocolo (como una interfaz Java). La mayoría de las API que afirman tratar con el tipo id
(recuerde, ese es el tipo de "cualquier objeto antiguo") realmente asumirá que responde a los mensajes en el protocolo. Para cuando necesite usar un objeto, en lugar de simplemente crearlo con un compilador, resulta útil doblar todo este comportamiento común como igualdad, hashing, descripciones de cadenas, etc. en la clase raíz.
¡Así que no necesitamos punteros vacíos! –
¿por qué lidiar con un bosque si podemos lidiar con un árbol? – irreputable