2010-07-20 2 views
0

Я довольно новичок в Objective-C и задаюсь вопросом, можно ли вводить объекты в качестве их супертипа, не получая предупреждений компилятора при их назначении, или если есть признанный способ достижения одной и той же вещи?Политизм супертипа Objective-C

Я понимаю, что это то, что для идентификатора типа, но у меня есть базовый класс с синтезированными свойствами, и если я пытаюсь использовать id, я получаю ошибку сборки «запрос для члена« x »в чем-то, что не является структурой или объединением» , по-видимому, потому, что динамическая типизация подходит для отправки сообщений объекту, но не для доступа к синтезированным свойствам.

Например, в Java я мог бы иметь:

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(); 

я в настоящее время выше, работающих в Objective-C, но с предупреждением компилятора: "задание от отдельного типа Objective-C"

OK, вот интерфейсы Objective-C, я могу добавить реализации, если вы хотите. Это композиционный картина:

//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

Только что я понял, что могу сортировать это путем кастинга! Кажется, мне не нужно, хотя, есть ли лучший способ сделать это? – baseten

+0

Давайте посмотрим код obj, а не код java - модель класса такая же – Mark

ответ

1

К сожалению, как я редактировал вопрос, я понял, что я пытался сделать это неправильный путь вокруг и назначить AbstractLeafNode к меню, поэтому предупреждение компилятора полностью имеет смысл. Нет ошибок при назначении меню в AbstractLeafNode.

Я слишком долго смотрел на это!

Смежные вопросы