• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Are polymorphic objects possible?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Are polymorphic objects possible?


  • Subject: Re: Are polymorphic objects possible?
  • From: Chris Hanson <email@hidden>
  • Date: Sat, 2 Nov 2002 14:34:18 -0600

At 7:49 PM +1100 11/2/02, Wade Tregaskis wrote:
Just change the "isa" and you're done. The only real use I know of is "thunks" for lazy evaluation.

self->isa=[WTFoo class];

That is indeed very easy. What happens, however, when a message is sent to my WTMorphy object, a message which only say WTFoo accepts? Will that message only be passed on if WTMorphy is pretending to be WTFoo, and 'lost' if it's pretending to be WTBar? Or will the message always be passed on so long as the receiver for it actually exists, irrelevant of what isa thinks?

No. Messages are always sent to objects. If your object doesn't handle a message it receives, the runtime will send your object -methodSignatureForSelector: followed by -forwardInvocation:. NSObject's implementation of -forwardInvocation: just sends your object -

This prompts the question as to whether two identical method declarations on two different objects translate to the same "address", if I can continue using the message metaphor. i.e. will a message intended for "myUniqueMethodName" on object WTBar still go to "myUniqueMethodName" on object WTMorphy?

I think I know what your problem is. You're still thinking in C++ -- that is, you're assuming there's some sort of "tight" binding between messages and objects. There isn't.

When you write [myObject myUniqueMethodName] the compiler translates this into something like

objc_msgSend(myObject, @selector(myUniqueMethodName));

There's no static binding at all between myObject and @selector(myUniqueMethodName); the instance method in myObject corresponding to @selector(myUniqueMethodName) is looked up at runtime and invoked. (Or, if one isn't found in myObject or any of its superclasses, the runtime does the -methodSignatureForSelector: and -forwardInvocation: dance.)

So if myObject is an instance of WTMorphy, the runtime will try to look up the instance method for -[WTMorphy myUniqueMethodName]. If myObject is an instance of WTFoo, the runtime will try to look up the instance method for -[WTFoo myUniqueMethodName]. And so on.

Is this clearer?

-- Chris

--
Chris Hanson | Email: email@hidden
bDistributed.com, Inc. | Phone: +1-847-372-3955
Making Business Distributed | Fax: +1-847-589-3738
http://bdistributed.com/ | Personal Email: email@hidden
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.

  • Prev by Date: Re: usage of #import?
  • Next by Date: shared PrintInfo
  • Previous by thread: Re: Are polymorphic objects possible?
  • Next by thread: Re: Cocoa really needs to be thread-safe (Dave Rehring)
  • Index(es):
    • Date
    • Thread