objective c - tutorial - Implementar un método virtual puro en Objective-C
objective c vs swift (6)
Cuando programa en Objective-C necesita purgar su mente de cosas tales como métodos virtuales. No llama a métodos en objetos Objective-C, les envía mensajes. Los objetos responden a los mensajes o no, pero debido a la vinculación dinámica, no puede decir esto hasta el tiempo de ejecución.
Por lo tanto, puede declarar un método en un objeto base y no proporcionar una implementación, no hay problema (excepto la advertencia del compilador), pero no puede tener el indicador del compilador activo cuando instancia directamente un objeto con dichos métodos y ganó No arroje un error en el tiempo de ejecución a menos que realmente envíe ese mensaje al objeto.
La mejor manera de crear clases base "virtuales" (en mi opinión) es declarar el método y darle una implementación de stub que arroje una excepción adecuada.
Quiero ir para allá. En serio, ¿cómo se puede implementar un método virtual puro de una manera "Apple"? ¿Usas un protocolo con tu clase base y lanzas excepciones sobre esos métodos?
Deberías usar:
- (void)doesNotRecognizeSelector:(SEL)aSelector method.
Como señaló Apple, aquí: https://developer.apple.com/library/mac/#documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html
Dependiendo de lo que esté haciendo, el patrón delegado puede ser más apropiado que una subclase, donde el delegado se define como id<YourDelegateProtocol>
. El compilador generará una advertencia si los métodos requeridos en el protocolo delegado no están implementados.
En general, se evita la creación de subclases en Objective-C, ya que los objetos no pueden heredar de múltiples superclases, pero pueden implementar múltiples protocolos.
En Objective-C, no hay soporte virtual puro como en C ++.
Una simulación sería que declaras un método en tu interfaz pero no lo implementas en tu archivo .m. Por supuesto, obtendrías advertencias de compilador, pero IIRC puedes desactivarlas. Pero no recibirá advertencias / errores si no los sobrescribe en la subclase, que obtiene en C ++ (IIRC).
Una alternativa sería implementarlos con solo un NSAssert(NO, @"Subclasses need to overwrite this method");
cuerpo. Aun así, solo captaría esto en tiempo de ejecución, no en tiempo de compilación.
Tienes algunas opciones, pero estás en el camino correcto.
ObjC no es compatible con esto directamente, forzar a las subclases a implementar un protocolo es la mejor manera de verificarlo en la compilación.
''Secretamente'' la implementación del método en la clase base y la afirmación es lo que hago para confirmar que el subclasser ha subclasificado correctamente en el tiempo de ejecución. Algunas personas tienen sentimientos encontrados sobre las afirmaciones, o deben dejarlas activas, por lo que esa no siempre es una buena solución.
También puede forzar que las subclases usen un constructor de clase específico y una secuencia de inicialización, luego verifique que hayan implementado todo lo requerido antes de devolver una instancia, en caso de que las advertencias del compilador no lo corten.
Pero a ObjC le faltan algunas características de lang que permiten a los clientes pegarse un tiro en el pie, o dar una solución alternativa a lo que desean, así que ... no deberías quedarte demasiado atrapado en aplicarlo.
nota: las excepciones son muy poco comunes (y un poco inseguras, también) en ObjC.
Un método virtual es un método cuyo comportamiento puede ser anulado dentro de una clase heredada por una función con la misma firma (es decir, el mismo nombre con el mismo número de params y tipo de params).
Ejemplo:-
@implementation BaseClass
-(void)viewDidLoad
{
[self virtualMethod:123];
}
-(void)virtualMethod:(int)param
{
//implement this method in subclass
}
@end
////////////////////////////////////////////////// //
@interface ChildClass:BaseClass
@end
@implementation ChildClass
-(void)virtualMethod:(int)param
{
NSLog(@"There is no keyword "Virtual" in Objective C.");
}
@end
Salida:-
"No hay una palabra clave" Virtual "en el Objetivo C."