"instanceof" doesn't check if an interface is implemented, neither in Flex nor using Closure inheritance in JavaScript. What we need for runtime checking of interface implementation is an global "is" function... I think I taught FalconJx to translate "ClassA is ClassB" as "is(ClassA, ClassB)". All we need to do now is to implement a global "is()" function and somehow teach the compiler to keep track of which classes implement which interfaces - all the way up the chain and sideways (interfaces can implement interfaces).
EdB On Wed, Oct 30, 2013 at 6:34 PM, Alex Harui <aha...@adobe.com> wrote: > Reviving this thread... > > Peter says he wants to test to see if an object implements an interface at > runtime. What mechanism do we want to use? > > I don't think we need to make instanceof work, just have some test to call. > > -Alex > > On 7/30/13 12:46 AM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: > >>When using interfaces for type checking, there are two 'kinds': at >>compilation and at runtime. >> >>The @interface and @implements annotations are for compile time checking. >> >>For runtime checking comes in two flavours: 'instanceof' and 'is'. >> >>Our method of setting up inheritance (goog.inherits) maintains the >>inheritance chain, so 'instanceof' works out of the box. >> >>The work starts with 'is'. We want to story the 'extends' and >>'implements' metadata from AS in the JS classes and create a method to >>test against that metadata set. I have a pretty good idea on how to >>implement such a beast, but it will require some (ha!) tinkering with >>the FlexJS JS framework and FalconJx. That will take some time... >> >>EdB >> >> >> >>On Mon, Jul 29, 2013 at 9:17 PM, OmPrakash Muppirala >><bigosma...@gmail.com> wrote: >>> On Mon, Jul 29, 2013 at 11:20 AM, Alex Harui <aha...@adobe.com> wrote: >>> >>>> I think FalconJS was going to generate something like: >>>> >>>> if (child != undefined && >>>> child.$implements["org.apache.flex.core.IChrome"]) >>>> >>>> Not sure what it was going to do for classes, maybe chase the prototype >>>> chain? >>>> >>>> The other thing that occurred to me about $implements or >>>>child.is(IChrome) >>>> is that all objects must then have these properties or functions where >>>>the >>>> global function could work out of a central database that doesn't >>>>decorate >>>> the classes. >>>> >>>> I don't have a strong opinion either way right now. >>>> >>>> -Alex >>>> >>> >>> From all my research on Closure's @implements handling, it seems like >>>there >>> should be at least one method/member in the @interface. So how will it >>> handle 'Marker Interfaces', i.e. interfaces which have no methods. >>> >>> IChrome - which we have been discussing in the other thread is this >>>kind of >>> an interface. It is used to just mark an object so it can be used for >>>type >>> checking. >>> >>> Is this possible with Closure? Sorry, I have not set up to Closure >>> properly on my machine. Can one of you try this out to see if it is >>> possible? >>> >>> Thanks, >>> Om >>> >>> >>>> >>>> On 7/29/13 10:49 AM, "Kessler CTR Mark J" <mark.kessler....@usmc.mil> >>>> wrote: >>>> >>>> >Looking on it a second time, I guess you have to test it exists in >>>>there >>>> >for both, so maybe it's a moot issue. >>>> > >>>> >-Mark >>>> > >>>> >-----Original Message----- >>>> >From: Kessler CTR Mark J [mailto:mark.kessler....@usmc.mil] >>>> >Sent: Monday, July 29, 2013 1:43 PM >>>> >To: dev@flex.apache.org >>>> >Subject: RE: [FlexJS] Handling chrome elements >>>> > >>>> > I've gotten used to being able to do Type checks with "is". It >>>>also >>>> >stands out as a different format visually. I think the only problem >>>> >with that change is, the child couldn't be null/undefined. It would >>>>have >>>> >to be able to run that method. Whereas the current "is" can compare >>>>the >>>> >datatype with it being null/undefined. >>>> > >>>> > >>>> >-Mark >>>> > >>>> >-----Original Message----- >>>> >From: Erik de Bruin [mailto:e...@ixsoftware.nl] >>>> >Sent: Monday, July 29, 2013 12:59 PM >>>> >To: dev@flex.apache.org >>>> >Subject: Re: [FlexJS] Handling chrome elements >>>> > >>>> >Ah, the "is" issue. >>>> > >>>> >We don't seem to be able to get out from under a 'helper' method (or >>>> >whatever the term-du-jour is for that thing) and a 'storage' property. >>>> > >>>> >Personally I like to go from this AS: >>>> > >>>> >if (child is IChrome) >>>> > >>>> >to this JS: >>>> > >>>> >if (child.is(IChrome)) >>>> > >>>> >That would make it relatively easy to work with it in the cross >>>> >compiler. Another possibility is to have a global function, but I >>>> >don't like that very much. >>>> > >>>> >Thoughts? >>>> > >>>> >EdB >>>> > >>>> > >>>> > >>>> >On Mon, Jul 29, 2013 at 4:23 PM, Alex Harui <aha...@adobe.com> wrote: >>>> >> Thanks for that. I'm more interested in the runtime use of >>>>interfaces. >>>> >> What is the JS output for this AS? >>>> >> >>>> >> if (child is IChrome) >>>> >> >>>> >> It looked like FalconJS was going to create a $implements object on >>>>each >>>> >> class and "is" code would test against that. What should we do for >>>> >> FalconJX? >>>> >> >>>> >> Thanks, >>>> >> -Alex >>>> >> >>>> >> >>>> >> On 7/28/13 11:50 PM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: >>>> >> >>>> >>>More on how to write the JS side: >>>> >>> >>>> >>> >>>> >>>>https://developers.google.com/closure/compiler/docs/js-for-compiler#tags >>>> >>> >>>> >>>Search for '@implements'. It has a short but sweet example. >>>> >>> >>>> >>>EdB >>>> >>> >>>> >>> >>>> >>> >>>> >>>On Mon, Jul 29, 2013 at 8:43 AM, Erik de Bruin <e...@ixsoftware.nl> >>>> >>>wrote: >>>> >>>>>> >Also IChrome (looks like a Marker Interface) could lead to a >>>>subtle >>>> >>>>>> >problem >>>> >>>>>> >on the JS side. I have not been following the conversation on >>>>how >>>> >>>>>>to deal >>>> >>>>>> >with Interfaces on the JS side. If we are planning on using >>>>'duck >>>> >>>>>> >typing', >>>> >>>>>> >then we could run into issues with empty interfaces. Or am I >>>> >>>>>>missing >>>> >>>>>> >something here? >>>> >>>>>> I'm not sure what we'll end up doing for interfaces on JS. It >>>>looks >>>> >>>>>>like >>>> >>>>>> some compiler code expects to list interfaces in an $implements >>>> >>>>>>property >>>> >>>>>> object. >>>> >>>>>> >>>> >>>>> >>>> >>>>> Can someone shine some light on this? Erik, Michael? >>>> >>>> >>>> >>>> Interfaces on the JS side are implemented for the Closure Compiler >>>> >>>> using the @interface for declaration and the @implements JSDoc >>>> >>>> annotation. FalconJx knows about this, so - with caution and >>>>testing - >>>> >>>> you should be able to approach interfaces the same in JS as in AS. >>>> >>>> >>>> >>>> Let me know if I can help out with some example code or something. >>>> >>>> Also, if you run into problems, I can alway crack open FalconJx >>>>and >>>> >>>> create the solution you would like to see. >>>> >>>> >>>> >>>> EdB >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> -- >>>> >>>> Ix Multimedia Software >>>> >>>> >>>> >>>> Jan Luykenstraat 27 >>>> >>>> 3521 VB Utrecht >>>> >>>> >>>> >>>> T. 06-51952295 >>>> >>>> I. www.ixsoftware.nl >>>> >>> >>>> >>> >>>> >>> >>>> >>>-- >>>> >>>Ix Multimedia Software >>>> >>> >>>> >>>Jan Luykenstraat 27 >>>> >>>3521 VB Utrecht >>>> >>> >>>> >>>T. 06-51952295 >>>> >>>I. www.ixsoftware.nl >>>> >> >>>> > >>>> > >>>> > >>>> >-- >>>> >Ix Multimedia Software >>>> > >>>> >Jan Luykenstraat 27 >>>> >3521 VB Utrecht >>>> > >>>> >T. 06-51952295 >>>> >I. www.ixsoftware.nl >>>> >>>> >> >> >> >>-- >>Ix Multimedia Software >> >>Jan Luykenstraat 27 >>3521 VB Utrecht >> >>T. 06-51952295 >>I. www.ixsoftware.nl > -- Ix Multimedia Software Jan Luykenstraat 27 3521 VB Utrecht T. 06-51952295 I. www.ixsoftware.nl