define-com-implementation
class-name
(
superclass-name*
)
(
slot-specifier*
)
class-option*
A symbol naming the class to define.
A symbol naming a superclass to inherit from.
A slot description as used by
defclass
.
An option as used by
defclass
.
The macro
define-com-implementation
defines a
standard-class
which is used to implement a COM object. Normal
defclass
inheritance rules apply for slots and Lisp methods.
Each
superclass-name
argument specifies a direct superclass of the new class, which can be another COM implementation class or any other
standard-class
provided that com-object is included somewhere in the overall class precedence list. To get the built-in handling for the i-unknown interface, inherit from standard-i-unknown (which is the default superclass if no others are specified).
The
slot-specifier
s are standard
defclass
slot definitions.
The class-option s are standard defclass options. In addition the following options are recognized:
(:interfaces interface-name *)
Each
interface-name
specifies a COM interface that the object will implement.
i-unknown
should not be specified unless the you wish to replace the standard implementation provided by
standard-i-unknown
. If more than one
interface-name
is given then all the methods must have different names (except for those which are inherited from a common parent interface).
(:inherit-from class-name interface-name *)
This indicates that the class will inherit the implementation of all the methods in the interfaces specified by the
interface-names
directly from
class-name
. The
class-name
must be one of the direct or indirect superclasses of the class being defined. Without this option, methods from superclasses are inherited indirectly and can be shadowed in the class being defined. Use of
:inherit-from
allows various internal space-optimizations.
For example, given a COM class
foo-impl
which implements the
i-foo
interface, this definition of
bar-impl
:
(define-com-implementation bar-impl ()
()
(:interfaces foo-impl))
will allow methods from
i-foo
to be shadowed whereas this definition:
(define-com-implementation bar-impl ()
(:interfaces foo-impl)
(:inherit-from foo-impl i-foo))
will result in an error if a method from
i-foo
is redefined for
bar-impl
.
(:dont-implement interface-name *)
This option tells
standard-i-unknown
that it should not respond to
query-interface
for the given
interface-name
s (which should be parents of the interfaces implemented by the class being defined). Normally,
standard-i-unknown
will respond to
query-interface
for a parent interface by returning a pointer to the child interface.
For example, given an interface
i-foo-internal
and subinterface
i-foo-public
, the following definition
(define-com-implementation foo-impl ()
()
(:interfaces i-foo-public))
specifies that
foo-impl
will respond to
query-interface
for
i-foo-public
and
i-foo-internal
, whereas the following definition
(define-com-implementation foo-impl ()
(:interfaces i-foo-public)
(:dont-implement i-foo-internal))
specifies that
foo-impl
will respond to
query-interface
for
i-foo-public
only.
(define-com-implementation i-robot-impl ()
((tools :accessor robot-tools))
(:interfaces i-robot)
)
(define-com-implementation i-r2d2-impl (i-robot-impl)
()
(:interfaces i-robot i-r2d2)
)