simple sencillo relaciones programacion polimorfismo orientada objetos herencia entre ejemplos ejemplo diagrama clases asociacion objective-c properties subclassing override synthesis

objective c - sencillo - ¿Cómo anular la propiedad de una superclase con tipos más específicos?



relaciones entre clases programacion orientada a objetos (2)

La advertencia ya dio la pista correcta. Utilicé @dynamic en la subclase dominante y todo está bien.

El escenario
Tengo una situación en la que una clase base llamada AbstractRequest tiene una propiedad delegada de tipo id <AbstractRequestDelegate> declarada en el archivo de encabezado:

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;

El protocolo de delegado abstracto contiene algunos métodos requeridos y, como se indica con la palabra ''resumen'', tanto la AbstractRequest como la AbstractRequestDelegate están destinadas a ser subclases / ampliadas.

Un ejemplo de esto sería la subclase ConcreteRequest y el protocolo extendido ConcreteRequestDelegates, que agregan métodos adicionales a los abstractos. La intención es que tanto los métodos de clase abstractos como los concretos puedan enviar mensajes a la única instancia de delegado asignada.

En un determinado momento, ConcreteRequest desea llamar a un método en el delegado definido por ConcreteRequestDelegate. Debido a que el tipo del delegado es id, el compilador dará una advertencia de que este método podría no implementarse.

ConcreteRequest.m: 38: warning: la propiedad ''delegate'' requiere que se defina el método ''-delegate'' - use @synthesize, @dynamic o proporcione una implementación del método

El problema
Esta advertencia está justificada, ya que la propiedad se escribe después de todo en id <AbstractRequestDelegate> . Para solucionar esto, quiero aclarar al compilador que el delegado asignado a la instancia concreta debe ser de tipo id <ConcreteRequestDelegate> . Esto me sonó perfectamente razonable, así que puse una nueva propiedad en el encabezado de ConcreteRequest, esperando anular la abstracta:

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;

Pero aquí es donde el compilador no está de acuerdo conmigo, probablemente con una buena razón. Pensé que sería una advertencia para anular la propiedad de una súper clase con el tipo incorrecto, pero en su lugar solo me exige que vuelva a sintetizar esta nueva propiedad. No quiero ir allí, porque entonces los métodos de la súper clase no tendrán acceso a la misma propiedad de delegado.

La pregunta
¿Hay una manera de "volver a declarar" la propiedad en la subclase concreta con la información de tipo agregada? ¿O puede detectar el error en mi pensamiento, porque quizás este es un problema bastante común que no he visto hasta ahora?

Aclamaciones,
EP

PS Todos los nombres de clase y protocolo que aparecen en este trabajo son ficticios. Cualquier parecido con nombres de clase y protocolo reales, de código abierto o patentado, es pura coincidencia.


Simplemente sintetice el id<ConcreteRequestDelegate>delegate en ConcreteRequest.m funcionará bien ... No creará ningún problema.