Я довольно новичок в 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;
Только что я понял, что могу сортировать это путем кастинга! Кажется, мне не нужно, хотя, есть ли лучший способ сделать это? – baseten
Давайте посмотрим код obj, а не код java - модель класса такая же – Mark