Author(s): Angel Fernandez Pineda, Angel Fernandez Pineda.
Version: 1.11#222 (2004/5/24, 13:8:7 CEST)
Version of last change: 1.7#51 (2001/1/25, 21:33:0 CET)
This library provides run-time support for object creation and manipulation. Objects are also called class instances, or simply instances.
Objects in Ciao are treated as normal modules. This is, an object is a run-time generated Prolog module, which may be identified by an unique term across the whole application.
This is a very simple example of how to create an instance, and how to make calls to it:
AnObj new myclass, AnObj:mymethod.
In order to make any object accessible from code, an usage relationship must be established between the class (from which instances are derived) and the code itself. Refer to
use_class/1
predicate or
use_class/1
declaration in order to do so.
objects_rt
):- module(ModuleName,Exports,[objects]).Nothing special needs to be done.
objects_rt
)Dynamic instance creation takes place by the ways of this predicate.
It takes a free variable as first argument which will be instantiated to an internal object identifier.
Second argument must be instantiated to a class constructor. Class constructors are designed to perform an initialization on the new created instance. Notice that instance initialization may involve some kind of computation, not only state initialization.
A class constructor is made by a functor, which must match the intended class name, and any number of parameters. For example:
Obj new myclass(1500,'hello, world!!!')
Those parameters depends (obviously) on the constructors defined at the class source. If no constructors where defined, no parameters are needed. This is called the default constructor. An example:
Obj new myclass
The default constructor can not be called if there is any constructor available at the class source.
Instantiation will raise an exception and fail whenever any of this conditions occur:
Objects may also be statically declared, refer to
instance_of/2
declaration.
Usage: new(InstanceVar, Constructor)
Constructor
returning its identifier in InstanceVar
InstanceVar
is a free variable.
(term_typing:var/1
)
Constructor
is a term whose functor matches a class name.
(objects_rt:constructor/1
)
InstanceVar
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
This predicate is used to perform dynamic type checking. You may check whether a particular instance belongs to a particular class or related descendants.
instance_of/2 is used to perform static semantic analisys over object oriented code constructions.
By the use of instance_of/2 you may help to perform such analisys.
Usage 1: instance_of(Instance, Class)
Instance
was derived from any descendant of Class
, or that class itself
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
Class
is an atom denoting a class.
(objects_rt:class_name/1
)
Usage 2: instance_of(Instance, Class)
Instance
commencing on the creation class (that specified on call to
new/2
) and continuing on the rest of ascendant classes, if any.
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
Class
is a free variable.
(term_typing:var/1
)
Class
is an atom denoting a class.
(objects_rt:class_name/1
)
Test whether an object identifier was derived directly from a class, by the usage of
new/2
or a static instance declaration (
instance_of/2
).
Usage 1: derived_from(Instance, Class)
Instance
from Class
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
Class
is an atom denoting a class.
(objects_rt:class_name/1
)
Usage 2: derived_from(Instance, Class)
Class
responsable of the derivation of Instance
.
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
Class
is a free variable.
(term_typing:var/1
)
Class
is an atom denoting a class.
(objects_rt:class_name/1
)
This predicate is used to ensure a given interface to be implemented by a given instance.
Usage 1: interface(Instance, Interface)
Instance
implements the given Interface
.
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
Interface
is an unique atom which identifies a public interface.
(objects_rt:interface_name/1
)
Usage 2: interface(Instance, Interfaces)
Interfaces
of Instance
.
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
Interfaces
is a free variable.
(term_typing:var/1
)
Interfaces
is an unique atom which identifies a public interface.
(objects_rt:interface_name/1
)
Retrieves a character string representation from an object identifier and vice-versa.
Usage 1: instance_codes(Instance, String)
String
representation of given Instance
.
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
String
is a free variable.
(term_typing:var/1
)
String
is a string (a list of character codes).
(basic_props:string/1
)
Usage 2: instance_codes(Instance, String)
Instance
from its String
representation. Such an instance must be alive across the application: this predicate will fail whether the involved instance has been destroyed.
Instance
is a free variable.
(term_typing:var/1
)
String
is a string (a list of character codes).
(basic_props:string/1
)
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
As well as instances are created, they must be destroyed when no longer needed in order to release system resources.
Unfortunately, current O'Ciao implementation does not support automatic instance destruction, so user must manually call destroy/1 in order to do so.
The programmer must ensure that no other references to the involved object are left in memory when destroy/1 is called. If not, unexpected results may be obtained.
Usage: destroy(Instance)
Instance
.
Instance
is an unique term which identifies an object.
(objects_rt:instance_id/1
)
The behaviour of this predicate is identical to that provided by the declaration of the same name
use_class/1
. It allows user programs to dynamically load classes. Whether the given source is not a class it will perform a
use_module/1
predicate call.
Usage: use_class(ClassSource)
ClassSource
ClassSource
is a valid path to a prolog file containing a class declaration (without .pl extension).
(objects_rt:class_source/1
)
Usage: constructor(Cons)
Cons
is a term whose functor matches a class name.
Usage: class_name(ClassName)
ClassName
is an atom denoting a class.
Usage: interface_name(Interface)
Interface
is an unique atom which identifies a public interface.
Usage: instance_id(ID)
ID
is an unique term which identifies an object.
Usage: class_source(Source)
Source
is a valid path to a prolog file containing a class declaration (without .pl extension).
Usage: interface_source(Source)
Source
is a valid path to a prolog file containing a class declaration or an interface declaration (without .pl extension).
There is no difference between method or attribute specifications, and habitual predicate specifications. It is just a Functor/Arity term.
Usage: method_spec(Spec)
Spec
is a method or attribute specification.
Usage: virtual_method_spec(Spec)
Spec
is a method specification.
objects_rt
)user
module does not work properly. It is better to use the objects
package in a (proper) module.
use_module/1
) will not work properly: those instances may be not correctly created, and predicates will fail whenever they are not supposed to do. This may be avoided by reloading again the involved module, but make sure it is modified and saved to disk before doing so.
Go to the first, previous, next, last section, table of contents.