2009-07-26 4 views
3

Ich bin Protokolle in einigen Klassen zuweisen, die einem Vererbungsbaum folgen. Wie so:Können Protokolle innerhalb von Protokollen so behandelt werden, dass sie das von ihnen übernommene Protokoll enthalten?

erste Klasse

@protocol LevelOne 
- (void) functionA 
@end 

@interface BaseClass : NSObject <LevelOne> { 
} 

zweiter Klasse

@protocol LevelTwo <LevelOne> 
- (void) functionB 
@end 

@interface SubClass : BaseClass <LevelTwo> { 
} 

Später bin Zuweisung ich die Klasse als Delegierter Eigenschaften anderer Klassen

Basisklasse

@interface AppClass : NSObject { 
    @protected 
    id<LevelOne> levelOneDelegate; 
} 

@property (assign) id<LevelOne> levelOneDelegate; 

Unterklasse

Am Ende dieser Reise hat AppClassesFriend 2 Objekte.

"levelOneDelegate" hat Zugriff auf "functionA", wenn es einem BaseClass-Objekt zugewiesen ist.

Ich finde jedoch, dass "levelTwoDelegate" hat nur Zugriff auf "functionB" (es ist mit einem SubClass-Objekt zugewiesen).

Um AppClassesFriend in der Lage zu sein, beide Funktionen zu verwenden, scheint es, dass ich BEIDE eine levelOneDelegate UND levelTwoDelegate zuweisen muss.

Gibt es eine Möglichkeit, "levelTwoDelegate" Zugriff auf beide zu haben? Da stehen beide Funktionen auf "SubClass" zur Verfügung.

Also, was würde Ich mag Lage sein zu tun ist:

SubClass *s = [SubClass alloc]; 
AppClassesFriend *a = [AppClassesFriend alloc]; 
a.levelTwoDelegate = s; 

so innerhalb AppClassesFriend (a) ich verwenden könnte:

[self.levelTwoDelegate functionA]; <---- this is never found 
[self.levelTwoDelegate functionB]; 

aber es scheint, ich muss hinzufügen

a.levelOneDelegate = s; 

Danke, wenn jemand sich die Zeit genommen hat, den ganzen Weg bis hierher zu lesen. Zusammenfassend lautet die Frage: Wie bekomme ich "levelTwoDelegate", um sowohl auf functionA als auch auf functionB zugreifen zu können?

Antwort

2

einfach erklären, dass beide Ebene ein und Niveau der Unterklasse zwei Protokolle delegieren Eigenschaft implementiert (d implementiert sowohl Funktioneine und FunktionD):

@interface AppClassesFriend : AppClass { 
    @protected 
    id<LevelOne,LevelTwo> levelOneAndTwoDelegate; 
} 

@property (assign) id<LevelOne,LevelTwo> levelOneAndTwoDelegate; 
+0

Dank - das ist richtig, obwohl mein Problem eine zusätzliche Facette hatte es scheint! Da die Oberklassen nur für die Verwendung von levelOneDelegate codiert sind, verwenden alle nicht überschreibenden Methoden standardmäßig diesen Code. Es ist nicht möglich, levelOneDelegate in einer Unterklasse neu zuzuweisen, um zusätzliche Protokolle hinzuzufügen, also muss entweder die Basisklasse ALLE Protokolle beachten (auf keinen Fall zu schlampig) oder ich muss den Empfänger den beiden Delegaten zuweisen. – Michael

+0

Es ist nicht möglich, levelOneDelegate neu zuzuweisen, aber Sie können einen zusätzlichen Delegattyp definieren, der den ursprünglichen ersetzt. UITextView führt dies beispielsweise so aus, dass sein Delegat UITextViewDelegate statt UIScrollViewDelegate implementiert. Erklären Sie einfach functionA in SuperclassDelegate und functionA und functionB in SubclassDelegate. – hatfinch