开发者

Declaring an object type in an if statement

开发者 https://www.devze.com 2023-01-14 22:39 出处:网络
I\'m trying to declare a variable inside an if statement. If the result of a query is YES then the object will be of one type, otherwise it will be of another type. A bit like this...

I'm trying to declare a variable inside an if statement. If the result of a query is YES then the object will be of one type, otherwise it will be of another type. A bit like this...

if (YES) {
          ObjectTypeA *object = [[ObjectTypeA] alloc] init];
}

else {
      ObjectTypeB *object = [[ObjectTypeB] alloc] init];
}

Once that's done I want to use object with the same methods no matter what type it is. I tried declaring object as an id before the if statement but get an error: member reference type 'struct objc_object *' is a pointer; maybe you meant to use '->'?

I also tried declaring both to be 开发者_如何学Pythonseparate objects outside the if and then make the pointer point to whichever it was once I knew. That wouldn't work either.

I know that the compiler is trying to protect me from myself by doing this but in this circumstance I need a way round it please.

Thanks.


The most common pattern for this problem in Cocoa/Cocoa Touch is to define a protocol.

A protocol is a collection of methods that can be implemented by any object.

If you make ClassA and ClassB conform to a protocol containing the methods you need them to respond to then you don't need to worry about which type of object you get.

The idea is "if it looks like a duck and quacks like a duck, then it's probably a duck".

You can use dynamic typing and create your objects depending on the outcome of your query, but ensure that the resulting object conforms to a particular protocol, like so:

id <MyProtocol> myObject;

if (YES)
    myObject = [[ClassA alloc] init];
else
    myObject = [[ClassB alloc] init];

[myObject myMethod];
[myObject release];


I think this code should work well:

id obj = nil;

if (YES) {
   obj = [[ObjectTypeA] alloc] init];
} else {
   obj = [[ObjectTypeB] alloc] init];
}

[obj performSelector:@selector(YOUR_METHOD) withObject:YOUR_OBJECT];


You want dynamic typing :)

The way around this is to declare a third object that both of these inherit from

OR

You could use the adapter pattern and create an object that accepts both of these objects as a member and then wrap the functions you wish to call into that object

good luck!

--> These are genral OO solutions; I'm not a Objective-C developer

0

精彩评论

暂无评论...
验证码 换一张
取 消