>> You can have an engine that checks collisions and accepts IHitable objects; 
>>another engine would be in charge of moving the objects around and so it 
>>takes IMoveable object

Juan, excellent, excellent post.  So in a case like that, sounds like you would 
often just typecast method arguments as an interface and not a concrete class, 
right?   

i.e. instead of:

  public function moveIt(moveObject:MoveObject):void{} 

do this:

  public function moveIt(moveObject:IMoveable):void{} 



 Jason Merrill
 Instructional Technology Architect
 Bank of America  Global Learning 

 tweets @ jmerrill_2001
 Join the Bank of America Flash Platform Community  and visit our Instructional 
Technology Design Blog 
 (Note: these resources are only available to Bank of America associates). 
   



-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Juan Pablo 
Califano
Sent: Friday, September 24, 2010 1:15 AM
To: Flash Coders List
Subject: Re: [Flashcoders] Inheritance and abstract classes

>>>
Despite what the naming conventions are, since the only thing, IMHO, that 
interfaces are useful for, is determining if the object being passed to a 
method complies and has methods/properties that can be used, without having to 
write code to check if the object being passed actually has all the desired 
methods/properties.
>>>

You can already do that with a class. As long the language is static typed (or 
is dynamically typed but types contranis are enforced at compile-time, as in AS 
2.0 and in some cases AS 3.0), the compiler checks that without the need of an 
interface.

I'd say that, conceptually, an interface is every method and property (and 
event, arguably) that a type exposes. So, you know x, y, height, widht, etc, 
are part of DisplayObject's interface (even though DisplayObject is a class; 
one you cannot instantiate or derive from without crashing at runtime, though; 
but that's more a hack hardcoded in the player for the lack of support of 
abstract classes in the language; and if you ask me, DisplayObject should have 
been an interface or there should be an IDisplayObject interface, but I 
digress).

Now, knowing an object has certain capabilities is very useful, especially when 
writting libraries, frameworks and that sort of code. Your code could declare 
that it accepts objects that comply with certain "interface" (and here I don't 
mean necessarily the interface keyword / construct, but rather what I said in 
the previous paragraph). This is what you pointed out. But the difference is 
that you can have an object implement an interface without coupling it with 
some concrete class. So it's more flexible and it's possible for some object to 
implement more than one interface (and possibly unrelated interfaces).

In a game, for instance, you can have "entities" (or whatever you like to call 
it). Following you IMoveable example, you could have other interfaces such as 
IShooter, IHitable, etc. You can have an engine that checks collisions and 
accepts IHitable objects; another engine would be in charge of moving the 
objects around and so it takes IMoveable object; another could be in charge of 
common tasks that need to be performed on shooters, so I'd act on IShooter's; 
and so on.

Now, the advantage of using interfaces is that you can combine these sets of 
functionalities (as declared by the interfaces) in one object indepently, 
without having to force inheritance relations that might not make sense and 
could add nasty side-effects. I.e. an object could be hitable but not moveable, 
a shooter could be either moveable / not moveable, etc. So you could have a 
turret (IHitable, IShooter, but not IMoveable), and wall / obstacle (IHitable 
but not IMovable nor IShooter), and enemy ship (IHitable, IShooter and 
IMoveable), a bullet (IMoveable and IHitable but not IShooter since it doesn't 
shoot by itself). Without interfaces and only realying on inheritance this 
could turn into a mess rather quickly.

This is important in languages such as Actionscript (which took the idea from 
Java), because multiple inheritance is not allowed. In other languages such as 
C++, you can have a class inherit from (and hence "being-a") any number of 
classes so the interface construct / syntax is not necessary (although multiple 
inheritance has other drawbacks and is more complex, and that's why it was left 
out of Java and other languages followed it this idea).

That said, you don't need to have interfaces or even abstract classes for 
everything, in my opinion. This adds flexibility and some space for future 
expansion but it comes at the cost of making things more complex. If you're 
writing a library and want to allow different "clients" to use it, having your 
methods accept interfaces instead of concrete / abstract classes is a good 
idea. You can even provide some default / minimal implementation but leave it 
open to your "clients" to implement their own and still be able to use your 
library, without having to extend some class (which is not always possible / 
practical). In lots of application code, though, I think you don't really need 
this extra flexibility and many times it adds more work for little benefit.

Cheers
Juan Pablo Califano

2010/9/23 Anthony Pace <[email protected]>

>  On 9/23/2010 3:51 PM, Henrik Andersson wrote:
>
>> you say Picture IS-A IDrawable.
>>
> Despite what the naming conventions are, since the only thing, IMHO, 
> that interfaces are useful for, is determining if the object being 
> passed to a method complies and has methods/properties that can be 
> used, without having to write code to check if the object being passed 
> actually has all the desired methods/properties.
>
> e.g.  According to my understanding:
> human, cat, dog  are different objects, but they all have an 
> IMoveAround interface So I know If I pass one of the objects to a 
> method that it can use the blueprints defined by the interface without 
> something breaking, and have each walk,crawl, Jump, etc... in their 
> own way.
>
> so shouldn't it be has-a?  or it-has? or they-have? or is-able?
>
> Maybe I am not experienced enough with solid OOP, but that's the way I 
> am understanding things right now.
>
> _______________________________________________
> Flashcoders mailing list
> [email protected]
> http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
>
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Reply via email to