0

私は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 タイプからの割り当て」

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;
4

1 に答える 1

1

申し訳ありませんが、質問を編集しているときに、間違った方法でAbstractLeafNodeをメニューに割り当てようとしていることに気付きました。そのため、コンパイラの警告は完全に理にかなっています。メニューを AbstractLeafNode に割り当てるときにエラーが発生しません。

私はあまりにも長い間これを見つめてきました!

于 2010-07-20T12:01:17.090 に答える