【问题标题】:Objective-C supertype polymorphismObjective-C 超类型多态性
【发布时间】:2010-07-20 10:25:02
【问题描述】:

我是 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 中进行了上述工作,但有一个编译器警告:“assignment from distinct Objective-C type”

好的,这里是 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;

【问题讨论】:

  • 刚刚意识到我可以通过投射来排序!感觉好像我不应该这样做,有更好的方法吗?
  • 我们看 obj C 代码而不是 java 代码——类模型是一样的

标签: objective-c polymorphism dynamic-typing


【解决方案1】:

抱歉,当我编辑问题时,我意识到我试图以错误的方式进行操作,并将 AbstractLeafNode 分配给菜单,因此编译器警告完全有道理。将菜单分配给 AbstractLeafNode 时没有错误。

我已经盯着这个太久了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2011-04-02
    相关资源
    最近更新 更多