On Tuesday, June 10, 2008, at 08:29AM, "Charles Srstka" <[EMAIL PROTECTED]> 
wrote:
>On Jun 9, 2008, at 5:55 PM, Hamish Allan wrote:
>
>> Sure. But it gives you *more* information than if it just returns
>> "id". I agree with you in all other respects of your post, but I don't
>> agree that +[NSArray array] returns "id" because if it returned
>> "NSArray *" you'd have to have a separate declaration for
>> +[NSMutableArray array]. Indeed, that line of reasoning leads to
>> John's way of thinking: that if you return something more specific
>> than "id", it is in some sense indicative that the returned object is
>> more likely to be of a specific class, rather than a subclass thereof.
>
>I think the problem is that if NSArray has +[NSArray array] returning  
>an NSArray, then NSMutableArray has to return an NSArray also, since  
>it can't have a different method signature for the same method. As a  
>result, if you called +[NSMutableArray array], the compiler would  
>think you were getting a regular, non-mutable NSArray, and you'd get a  
>warning if you tried to do this, although the code would still work:

I'm not sure if I follow you, but the trivial example below compiles with only 
one warning.  NSMutableArray could redeclare the superclass' implementation of 
+array, but that would have to be done for each factory method that presently 
returns an id, which is pretty annoying.  In addition, each successive subclass 
has to redeclare /and/ reimplement all of the factory methods.  Another 
example: if you subclass NSFontManager using setFontManagerFactory:, every time 
you call +sharedFontManager you have to cast to your subclass since it's 
strongly typed.

#import <Foundation/Foundation.h>
    
@interface Thing : NSObject
+ (Thing *)thing;
@end

@interface MutableThing : Thing
+ (MutableThing *)thing;
@end

@implementation Thing
+ (Thing *)thing { return [NSAllocateObject(self, 0, NULL) autorelease]; }
@end

@implementation MutableThing
+ (MutableThing *)thing { return [NSAllocateObject(self, 0, NULL) autorelease]; 
}
@end

int main (int argc, char const *argv[])
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    
    Thing *a = [Thing thing];
    a = [MutableThing thing];
    
    MutableThing *b = [MutableThing thing];   
    
    // warning: assignment from distinct Objective-C type
    b = [Thing thing];
    
    [pool release];
    return 0;
}     

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to