2010-05-19 12 views
8

Al igual que en Java:¿Cómo evitar los métodos de superclase siendo anulados por subclase en el objetivo - c

Un última clase no puede tener subclases. Esto se hace por razones de seguridad y eficiencia. En consecuencia, muchas de las clases de biblioteca estándar de Java son finales, por ejemplo, java.lang.System y java.lang.String. Todos los métodos en una clase final son implícitamente finales.

¿Cómo puedo lograr este comportamiento en objective-c?

+3

no se puede +++++ – Sam

+1

¿Qué quiere decir con seguridad? ¿Cómo '' java.lang.String' es 'final' mejorar la seguridad? – JeremyP

+0

@jeremyP : g oogle "usando final en java" obtendrá una respuesta. – Manjunath

Respuesta

10

No puede. La eficiencia no entra en eso. Si le molesta la seguridad, no use Objective-c. Siempre habrá una forma de evitar las medidas que tome.

+0

¿Estás seguro de que no tenemos ninguna de esas instalaciones en obj-c? ¿Quiso decir que obj-c no proporciona este tipo de seguridad? – Manjunath

+3

Objective-c es fundamentalmente abierto: puedo hacer cualquier cosa en tiempo de ejecución, agregar clases, eliminar propiedades, implementar métodos de intercambio e incluso compilar dinámicamente código nuevo sobre la marcha. Puedo hacer eso en cualquier clase, cualquier propiedad, incluso iVars privados y cualquier método. Ahora, claro, puedes usar todas estas técnicas para agregar medidas de seguridad a tu código (definitivamente no sería más eficiente). Pero las mismas medidas siempre estarán disponibles para cualquier persona que quiera sortear sus técnicas, por lo que no es un momento bien empleado. – hooleyhoop

4

No hay un equivalente final en el objetivo c. Hay mismos patrones que podrían ser una buena alternativa, le darán una mejor separación, pero ni el rendimiento ni la seguridad:

  1. Si sólo desea permitir ciertos métodos para sobrescribir utilizando delegate patrón podría ser una mejor elección.
  2. Si no desea crear subclases, puede usar el patrón abstract factory. Declare una interfaz pública + métodos de fábrica y oculte las clases de implementación concretas.
6

Como se ha dicho varias veces, no se puede.

Sin embargo, si está haciendo una biblioteca (que es el único caso en el que pude ver que esto es relevante, de todos modos) hay algunos pasos que puede tomar. Bueno, uno, realmente.

Escriba, en la documentación de la clase, que "Esta clase no está destinada a la creación de subclases". (Ref. NSIndexSet) o "No reemplazar este método." (ref. +[NSApplication sharedApplication].

Como modo de explicación, vale la pena señalar que casi todo() que pasa en Obj-C, y eso lo separa de C, ocurre en tiempo de ejecución, y el tiempo de ejecución es, por así decirlo, "Justo allí". Cualquier fragmento de código puede inspeccionar, mutar o pervertir el tiempo de ejecución en su tiempo libre, haciendo de Obj-C un lenguaje terriblemente poderoso; con respecto a su estructura de "metalenguaje"

Cuestiones relacionadas