2010-09-20 16 views
10

Agradeceré si alguien puede explicar la lógica detrás de la herencia de protocolos. p.ej. lo que significa lo siguiente (UITableView.h):Comprensión de la herencia de protocolos en Objective-C

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 

La siguiente implementación de clase no funciona. Tengo una clase View1 (que hereda UIView), con un protocolo asociado. Tengo otra clase, View2 (que inhertits View1). Ahora quiero heredar el protocolo también. Puede alguien señalarme hacia la dirección correcta.

Clase 1:

@protocol View1Delegate; 

@interface View1 : UIView { 
    id <View1Delegate> delegate; 
    // . . . 
} 

@property (nonatomic, assign) id <View1Delegate> delegate; // default nil. weak reference 

@end 

@protocol View1Delegate <NSObject> 
- (void)View1DelegateMethod; 
@end 

@implementation View1 

@synthesize delegate; 

// . . . 
@end 

Clase 2:

@protocol View2Delegate; 

@interface View2 : View1 { 
    id <View2Delegate> delegate; 
    // . . . 
} 

@property (nonatomic, assign) id <View2Delegate> delegate; // default nil. weak reference 

@end 

@protocol View2Delegate <NSObject> 
- (void)View2DelegateMethod; 
@end 

@implementation View2 

@synthesize delegate; 

// . . . 
@end 

Respuesta

11

Think que es más como composición en lugar de herencia.

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> define un protocolo que incluye todos los métodos del protocolo NSObject, el protocolo UIScrollViewDelegate, así como cualquiera de los métodos definidos para el protocolo de UITableViewDelegate. Cuando subclases y creas una nueva propiedad, estás anulando el tipo de propiedad de las superclases. Para que esto funcione como creo que desea, debe declarar View2Delegate como @protocol View2Delegate <NSObject, View1Delegate>.

+1

Gracias por su respuesta. Estoy declarando el protocolo como lo mencionaste, pero el problema al que me enfrento es con la declaración del delegado id <...>; En View1, tengo el delegado id ; con su @property asociado y @synthesize. Como estoy heredando View1 en View2, cuando declaro id delagete; con su @property y @synthesize asociados, aparece un error: "Propiedad" delegado "intenta usar ivar 'delegado' declarado en la superclase de 'View2'. ¿Cuál es la forma correcta de manejar esta situación? Consulte las clases de muestra i publicado arriba. – Mustafa

0

Es exactamente lo mismo que la herencia de interfaces en Java (interface UITableViewDelegate extends NSObject, UIScrollViewDelegate), C# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate), etc.