2010-07-20 24 views
0

Je suis assez nouveau à Objective-C et je me demande s'il est possible de taper des objets comme supertype sans recevoir d'avertissement du compilateur lors de leur affectation, ou s'il existe un moyen reconnu d'atteindre la même chose? Je me rends compte que c'est ce que l'id de type est pour mais j'ai une classe de base avec des propriétés synthétisées et si j'essaie d'utiliser id je reçois une erreur de construction "demande de membre 'x' dans quelque chose pas une structure ou une union" , sans doute parce que le typage dynamique est bien pour envoyer des messages à un objet mais pas pour accéder à des propriétés synthétisées.Objective-C polymorphisme supertype

Par exemple en Java je pourrais avoir:

public abstract class A { 
    public function doSomething() { 
    //some func 
    } 
} 

public class B extends A { 
    public function doSomething() { 
//override some func 
    } 
} 

public class C extends A { 
    public function doSomething() { 
//override some func 
    } 
} 

//and in my main class: 

A objB = new B(); 
A objC = new C(); 

//the purpose of all of this is so I can then do: 

A objHolder; 
objHolder = objB; 
objHolder.doSomething(); 
objHolder = objC; 
objHolder.doSomething(); 

J'ai actuellement le plus haut travail en Objective-C, mais avec un avertissement du compilateur: "cession de distinct de type Objective-C"

OK, voici les interfaces Objective-C, je peux ajouter les implémentations si vous le souhaitez. Il est un modèle composite:

//AbstractLeafNode 

#import <Foundation/Foundation.h> 

@interface AbstractLeafNode : NSObject { 
    NSString* title; 
    AbstractLeafNode* parent; 
} 

@property (nonatomic, retain) NSString* title; 
@property (nonatomic, retain) AbstractLeafNode* parent; 

@end 

//Page 

#import "AbstractLeafNode.h" 

@interface Page : AbstractLeafNode { 
    //there will be stuff here later! 
} 

@end 

//Menu 

#import "AbstractLeafNode.h" 

@interface Menu : AbstractLeafNode { 
NSMutableArray* aChildren; 
} 

- (void)addChild:(AbstractLeafNode *)node; 
- (void)removeChild:(AbstractLeafNode *)node; 
- (AbstractLeafNode *)getChildAtIndex:(NSUInteger)index; 
- (AbstractLeafNode *)getLastChild; 
- (NSMutableArray *)getTitles; 

@end 

// I'd then like to do something like (It works with a warning): 

AbstractLeafNode* node; 
Menu* menu = [[Menu alloc] init]; 
Page* page = [[Page alloc] init]; 
node = menu; 
[node someMethod]; 
node = page; 
[node someMethod]; 

// Because of the synthesized properties I can't do this: 
id node; 

// I can do this, but I suspect that if I wanted synthesized properties on the page or menu it would fail: 
node = (AbstractLeafNode*)menu; 
node = (AbstractLeadNode*)page; 
+0

Je viens de réaliser que je peux trier ça en castant! Il me semble que je ne devrais pas avoir à le faire, y a-t-il une meilleure façon de le faire? – baseten

+0

Voyons le code C obj pas le code java - le modèle de classe est le même – Mark

Répondre

1

Désolé, j'éditais la question que je réalisais que je tentais de le faire dans le mauvais sens et assigner un AbstractLeafNode à un menu, de sorte que le compilateur d'avertissement rend tout à fait sens. Aucune erreur lors de l'affectation d'un menu à un AbstractLeafNode.

Ça fait trop longtemps que je regarde ça!