21 votos

Solución para lograr las propiedades protegidas en el Objetivo-C

He estado intentando encontrar una solución para declarar las propiedades protegidas en el Objetivo-C para que sólo las subclases de la jerarquía puedan acceder a ellas (sólo lectura, no escritura). Leí que no hay una forma documentada de hacer esto, así que pensé en esta solución y quise pedir la opinión de StackOverflow al respecto.

Cada clase personalizada en la cima de la jerarquía contiene tres clases, una implementación y dos interfaces. Vamos a nombrarlas:

ClassA.h
ClassA_protected.h
ClassA.m

Entonces cualquier subclase de esta clase A sería la habitual:

ClassB.h
ClassB.m

Primero creé la interfaz Clase A.h donde declaro una variable int protegida para que cualquier subclase de la clase A pueda tener acceso a ella:

@interface ClassA : NSObject{
    @protected
    int _myProtectedInt;
}
@end

El siguiente paso es la solución a la que me refería. Sin embargo, una vez que lo lea, verá que es bastante sencillo. Declaré una segunda interfaz llamada ClaseA_protegido.h que en realidad funciona como un extensión de ClassA.h y nos permite etiquetar la propiedad como readonly :

#import "ClassA.h"
@interface ClassA ()
@property (nonatomic , readonly) int myProtectedInt;
@end

El último paso para preparar la jerarquía protegida es declarar su aplicación en Clase A.m. donde sólo sintetizamos nuestra propiedad:

#import "ClassA_protected.h"
@implementation ClassA
@synthesize myProtectedInt = _ myProtectedInt;
@end

De esta manera, cada clase que necesita ser una subclase de Clase A.h importará ClaseA_protegido.h en su lugar. Así que un niño como, por ejemplo Clase B.h sería lo siguiente:

#import "ClassA_protected.h"
@interface ClassB : ClassA
@end

Y un ejemplo de acceso a esta propiedad desde Clase B.m la implementación de la misma:

@implementation ClassB
-(void) method {
    //edit protected variable 
    _myProtectedInt= 1;

    //normal access
    self.muProtectedInt;
}
@end

13voto

Ole Begemann Puntos 85798

Claro, eso funciona bien. Apple utiliza el mismo enfoque, por ejemplo, en el UIGestureRecognizer clase. Las subclases tienen que importar la UIGestureRecognizerSubclass.h y anular los métodos que se declaran en ese archivo.

4voto

Septiadi Agus Puntos 632

Para las "propiedades" simples, sólo usa ivar en su lugar. Eso es tan bueno como las propiedades para todos los propósitos prácticos.

Además, el defecto ya está protegido.

2voto

Oleg Trakhman Puntos 1717

Si pide una opinión, esta es la mía: Si uno decide mutar su

_myProtectedInt

probablemente tendrá éxito de todos modos, porque es definitivamente posible con el tiempo de ejecución del Objetivo-C. Excepto esto, su solución está bastante bien.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X