¿Cuál es el equivalente a los métodos protegidos en Objective-C? Quiero definir métodos que solo las clases derivadas pueden llamar / implementar.
objective-c
LK.
fuente
fuente
Puede simular el acceso protegido y privado a los métodos haciendo lo siguiente:
Estas protecciones no se aplican, como señaló Sachin, en tiempo de ejecución (como en Java, por ejemplo).
fuente
UIGestureRecognizerSubclass.h
Esto es lo que hice para que los métodos protegidos fueran visibles para mis subclases, sin requerir que implementaran los métodos en sí. Esto significó que no recibí advertencias del compilador en mi subclase acerca de tener una implementación incompleta.
SuperClassProtectedMethods.h (archivo de protocolo):
SuperClass.m: (el compilador ahora te obligará a agregar métodos protegidos)
Subclase.m:
fuente
performSelector
hacerlo.[(id)obj hiddenMethod]
. Decir con precisión, el método protegido no es compatible con Objective-C.Acabo de descubrir esto y me funciona. Para mejorar la respuesta de Adam, en su superclase haga una implementación del método protegido en el archivo .m pero no lo declare en el archivo .h. En su subclase, cree una nueva categoría en su archivo .m con la declaración del método protegido de la superclase y puede usar el método protegido de la superclase en su subclase. En última instancia, esto no evitará que el autor de la llamada del método supuestamente protegido sea forzado en tiempo de ejecución.
fuente
protectedMethod
Otra forma de usar variables @protegidas.
fuente
Puede definir el método como un método privado de la clase principal y puede utilizarlo
[super performSelector:@selector(privateMethod)];
en la clase secundaria.fuente
Puede especie de hacer esto con una categoría.
Los métodos no están ocultos si importa la categoría en otra clase, pero simplemente no lo hace. Debido a la naturaleza dinámica de Objective-C, en realidad es imposible ocultar completamente un método, independientemente del tipo de instancia de llamada.
La mejor manera de hacerlo es probablemente la categoría de continuación de clase según la respuesta de @Brian Westphal, pero tendrá que redefinir el método en esta categoría para cada instancia de subclases.
fuente
Una opción es usar la extensión de clase para ocultar métodos.
En
.h
:En
.m
:fuente
@interface
declaración en el archivo .m. Puede simplemente declarar una función y usarla y la tratará como privada.Por lo general, nombro el método protegido con prefijo interno:
fuente