Полиморфизм супертипа Objective-C

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

Я понимаю, что это то, для чего предназначен идентификатор типа, но у меня есть базовый класс с синтезированными свойствами, и если я попытаюсь использовать идентификатор, я получу ошибку сборки «запрос члена« 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»

Хорошо, вот интерфейсы 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;

person baseten    schedule 20.07.2010    source источник
comment
Только что понял, что могу отсортировать это по кастингу! Мне кажется, что я не должен этого делать, есть ли лучший способ сделать это?   -  person baseten    schedule 20.07.2010
comment
Давайте посмотрим код obj C, а не код java - модель класса такая же   -  person mmmmmm    schedule 20.07.2010


Ответы (1)


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

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

person baseten    schedule 20.07.2010