For a detailed description of Duck Typing in ColdFusion, see Vy a Duck? on www.fusionauthority.com.
Simply put, Duck Typing is a concept that (within CFMX) only applies to CFCs -- the CFMX OO construct. A "primitive type" in CFMX (like a string, or a number) can't make use of Duck Typing because it has no ability to respond to method calls. However, when you're dealing with CFCs, you obviously HAVE to respond to method calls (also called messages or function calls).
Since ColdFusion uses the contents of a variable to determine what its type should be, all simple types are ultimately strings. Most complex objects can be treated as a Struct... for example a ColdFusion query object is a struct of arrays, one array for each column within a struct that keeps them all in a bundle. Since the VALUE of a variable is what determines how ColdFusion treats it, there's no concept of static typing within ColdFusion. In order for static typing to work, you have to know the kind of variable you want before you create it. With value-based typing, you can't know the type until after the variable has been populated.
Consequently, there has been some wish expressed by programmers who are more used to the strongly-typed C-based languages for things like "interfaces" and "constructors" and a large debate within the whole community about whether or these things are necessary. The argument has not been won by either side, but the fact of the matter is that ColdFusion treats OO constructs like a specialized Struct with User Defined Functions as keys. Since these UDFs are struct keys, they're considered variables and can't be known until runtime. The upshot of this peculiarity of CFMX is the possiblity to have your application verify that an object can respond to a method call before calling the method:
In this way, it's able to tell if your object can walk like a duck, talk like a duck or swim like a duck, and consequently you don't NEED to have interfaces in order to build a robust system. Using a technique called "mix-ins" you can assign new methods to an object (also called "behavior injection") if they're missing. For more info see the link at the top of this article.
Jared Rypka-Hauer
http://www.cfobjective.com