Interfaces
Lucee supports Interfaces which Components can implment multiple interfaces. Combined with the use of Mixins, Lucee Interfaces can help type check and document concise code.
Creating an Interface
Interfaces in Lucee are Components (files with the .cfc extension) but instead of defining a component, they define an interface:
Function definitions are placed within the interface just like in components, except the function bodies are not implemented.
Implementing an Interface
Once an interface is created, a normal Component can be created that implements the interface
Multiple Interfaces
Components can implement multiple interfaces by supplying a comma separated list for the implements attribute
Note: If implementing multiple interfaces, all function definitions in the interfaces must be identical. Lucee does not currently support method overloading.
Using Interface Type Checking
In Function Arguments
Function arguments can have a type annotation which checks that the object being passed in the argument conforms to the given interface.
As a Return Type
Functions can have an Interface as a return type to ensure that the value returned from the function call implements the interface.
The following example shows a function getObject() which will ensure that the return value implements IMyInterface
Type Checking Multiple Interfaces
In Lucee, it is not possible for a type annotation of a function argument or a return type, to specify that the value implements multiple interfaces. In order to defensibly guard that the function argument passed implments an interface, use additional guard assertions for each interface required.
This code above makes use of Lucee's component reflection capabilities of the getMetaData()
function to check if the component implements the interface. The structKeyExists() function will throw an error if it does not find the interface.