Objective c 目的-C超型多态性

Objective c 目的-C超型多态性,objective-c,polymorphism,dynamic-typing,Objective C,Polymorphism,Dynamic Typing,我对Objective-C相当陌生,我想知道是否有可能将对象类型化为它们的超类型,而在分配它们时不接收编译器警告,或者是否有一种公认的方法来实现同样的目标 我意识到这就是类型id的用途,但我有一个具有合成属性的基类,如果我尝试使用id,我会得到一个生成错误“请求非结构或联合中的成员“x”,大概是因为动态类型可以将消息发送到对象,但不能访问合成属性 例如,在Java中,我可能有: public abstract class A { public function doSomethin

我对Objective-C相当陌生,我想知道是否有可能将对象类型化为它们的超类型,而在分配它们时不接收编译器警告,或者是否有一种公认的方法来实现同样的目标

我意识到这就是类型id的用途,但我有一个具有合成属性的基类,如果我尝试使用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类型的赋值”

好的,这是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;
//抽象叶节点
#进口
@接口节点:NSObject{
NSString*标题;
抽象叶节点*父节点;
}
@属性(非原子,保留)NSString*标题;
@属性(非原子,保留)AbstractLeafNode*父级;
@结束
//页面
#导入“AbstractLeafNode.h”
@接口页:AbstractLeafNode{
//稍后这里会有东西!
}
@结束
//菜单
#导入“AbstractLeafNode.h”
@界面菜单:AbstractLeafNode{
NSMutableArray*aChildren;
}
-(void)addChild:(AbstractLeafNode*)节点;
-(void)removeChild:(AbstractLeafNode*)节点;
-(AbstractLeafNode*)getChildAtIndex:(NSInteger)索引;
-(AbstractLeafNode*)getLastChild;
-(NSMutableArray*)getTitles;
@结束
//然后我想做一些类似的事情(它带有警告):
抽象叶节点*节点;
菜单*菜单=[[Menu alloc]init];
页面*Page=[[Page alloc]init];
节点=菜单;
[节点方法];
节点=页面;
[节点方法];
//由于合成属性,我无法执行此操作:
id节点;
//我可以这样做,但我怀疑如果我想在页面或菜单上合成属性,它会失败:
节点=(AbstractLeafNode*)菜单;
节点=(AbstractLeadNode*)页;

很抱歉,在编辑问题时,我意识到我试图以错误的方式将AbstractLeafNode分配给菜单,因此编译器警告完全有意义。将菜单分配给AbstractLeaf节点时没有错误


我盯着这个看太久了

刚刚意识到我可以通过铸造来分类!我觉得我不应该这么做,有没有更好的方法呢?让我们看看obj C代码而不是java代码-类模型是一样的