Thanks for the response.

> On Jun 6, 2015, at 3:15 PM, Quincey Morris 
> <quinceymor...@rivergatesoftware.com> wrote:
> 
> On Jun 6, 2015, at 14:35 , Cosmo <minonom...@gmail.com> wrote:
>> 
>> Can somebody explain to me why I’m getting this different behavior. Is there 
>> anything I can do to achieve my goal?
> 
> The most likely immediate reason is that the class returned by '[self 
> classToUseForBackend]’ doesn’t actually implement a method called 
> ‘errorMessageForCode:’. If you think it does, check the spelling and 
> capitalization of the method name in the subclass.
> 
> However, the code fragments you show here don’t make any sense. Class methods 
> in Obj-C (methods with a ‘+’) have inheritance like instance methods. So, if 
> a subclass implements (say) ‘logout’, execution is never going to reach the 
> superclass implementation. If a subclass *doesn’t* implement (say) 
> ‘errorMessageForCode:’, you’re going to get an infinite loop.
> 

 The first code example I included definitely works. And I copied and pasted 
the method signatures from the superclass to the subclass, so there should not 
have been any differences. (I did it a second time for that second example to 
make sure that wasn’t the source of the problem.)

> Furthermore, if the subclass method happens to call the ‘super’ method, then 
> you will again end up with an infinite loop.
> 
> If your intention is to have a class hierarchy where the base class defines 
> methods that the subclass must implement — that is, where the base class has 
> abstract methods — there are two straightforward ways:
> 
> 1. Define the base class method but don’t do anything in it, except possibly 
> to cause an exception:
> 
>       + (void) logout {
>               NSAssert (NO, @“Subclass responsibility”);
>       }
> 
> 2. Use a protocol instead of a base class:
> 
>       @protocol BaseClassProtocol
>               + (void) logout;
>       @end
> 
I should have explained that I’m calling these methods on instances of the 
superclass, not the subclass, so inheritance doesn’t work. I am trying create 
structures with a high-level object that my app knows about, which can call 
through to decoupled objects written for specific database backends. I suppose 
they don’t necessarily need to be subclasses, and that protocols might be a 
better solution.

In searching for an explanation before asking my question on this list I found 
a few discussions of message forwarding in Objective-C. I saw examples of 
forwarding messages with a return type and no parameters, and no return type 
with a single parameter. But none included anything about forwarding a message 
with both a return type and a parameter. I didn’t see anything saying this 
cannot be done, so I thought there might be somebody on this list who’d know 
more about that and could give me a definitive answer. For now, my totally 
baseless guess is that Objective-C does not support that combination.

In any event I realized that I could pass in a block and accomplish what I want 
successfully, so I can move on. But I will consider changing this to use 
protocols instead.




_______________________________________________

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to