2010-09-20 9 views
10

Ich bin dankbar, wenn jemand die Logik hinter der Protokollvererbung erklären kann. z.B. Was bedeutet die folgende Mittelwert (UITableView.h):Verstehen der Protokollvererbung in Objective-C

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 

Die folgende Klasse Implementierung funktioniert nicht. Ich habe eine Klasse View1 (die UIView erbt), mit einem zugehörigen Protokoll. Ich habe eine andere Klasse, View2 (die View1 inheritert). Jetzt möchte ich auch das Protokoll erben. Kann mir bitte jemand in die richtige Richtung zeigen.

Klasse 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 

Klasse 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 

Antwort

11

Betrachten Sie es als Zusammensetzung eher mehr als Vererbung.

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> definiert ein Protokoll, das alle Methoden des NSObject Protokoll umfasst, das UIScrollViewDelegate Protokoll, sowie alle für den UITableViewDelegate Protokoll definierten Methoden. Wenn Sie eine neue Eigenschaft ableiten und erstellen, überschreiben Sie den Typ der Superklasseneigenschaft. Damit dies funktioniert, wie Sie es sich wünschen, sollten Sie View2Delegate als @protocol View2Delegate <NSObject, View1Delegate> deklarieren.

+1

Dank für Ihre Antwort danken. Ich erkläre das Protokoll, wie Sie erwähnt haben, aber das Problem, mit dem ich konfrontiert bin, ist mit der Deklaration der ID <...> Delegat; In View1 habe ich ID delegieren; mit ihr ist @property und @synthesize zugeordnet. Da ich View1 in View2 vererbe, wenn ich id delagete deklariere; Mit der zugehörigen Eigenschaft @property und @synthesize erhalte ich einen Fehler: "Property 'delegate' versucht, ivar 'delegate' zu verwenden, das in der Superklasse von 'View2' deklariert ist. Wie kann diese Situation richtig behandelt werden? habe oben gepostet. – Mustafa

0

Es ist genau die gleiche wie die Vererbung von Schnittstellen in Java (interface UITableViewDelegate extends NSObject, UIScrollViewDelegate), C# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate) usw.