Method return types are covariant though, yes? So you should always be able
to return a more-derived type from a method that is declared to return a
less-derived type. If I read your example right, ClassA is "Animal" and
ClassB is "Cat" (in covariance-blog-post lingo). So that is legal, unless
I'm missing something.

Perhaps the issue is that the @interface for your overriding class (the one
that implements the override of "propA") does not redeclare that method as
returning (ClassB *)? I am away from Xcode right now (and as such have
immediately begun to doubt everything I know about programming and the
universe in general), but I reckon if you don't declare that in the
overridden @interface then other public callers are just going to dumbly
see the superclass @interface. But that's not a variance problem (again,
assuming I'm not messing something up here), that's just that you need to
declare it.

Peter



On Mon, Jan 4, 2016 at 11:40 AM, Jeff Kelley <slauncha...@gmail.com> wrote:

> Hi Dave,
>
>         For myClassA, you will always have to cast the return value to
> myClassB if you know that’s what will be returned. For a great blog post on
> the subject, I give you Mike Ash:
>
>
> https://mikeash.com/pyblog/friday-qa-2015-11-20-covariance-and-contravariance.html
>
>
> Jeff Kelley
>
> slauncha...@gmail.com | @SlaunchaMan <https://twitter.com/SlaunchaMan> |
> jeffkelley.org <http://jeffkelley.org/>
> > On Jan 4, 2016, at 11:24 AM, Dave <d...@looktowindward.com> wrote:
> >
> > Hi,
> >
> > In Objective-C, is it possible to override a property and have it return
> a different type to the base class?
> >
> > I have a base class with the following property defined:
> >
> > @property (nonatomic,retain)                  ClassA*
>  propA;
> >
> > and the following getter:
> >
> >
> > -(ClassA*) propA
> > {
> > return someValueOfClassA;
> > }
> >
> >
> > I’d like to override this in my subclass, as so:
> >
> > -(ClassB*) propA
> > {
> > ClassA*                       myClassA;
> > ClassB*                       myClassB;
> >
> > myClassA = super.propA;
> > myClassB = [[ClassB alloc] initWithClassA:myClassA]; //ClassB is a
> subclass of Class A
> >
> > return myClassB;
> > }
> >
> > I can do this ok, but when I access the property:
> >
> > // myClassA is already setup OK
> > ClassB*                               myClassB;
> >
> > myClassB = myClassA.propA;                    //Warning on this line
> saying return type is not ClassB
> >
> > and I have to coerce the value to be ClassB to get rid of the warning.
> Is there any way to avoid this?
> >
> > Thanks a lot
> > Dave
> _______________________________________________
>
> 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/vast.grapes%40gmail.com
>
> This email sent to vast.gra...@gmail.com
>
_______________________________________________

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