Each time we make a new account interface we want to ensure two things:
An easy way to do this is to add an
initialize-instance
after method specialized on
account-interface
. (In Common Lisp, each call to make an instance of a given class is automatically followed by a call to initialize that instance; you are free to specialize the
initialize-instance
generic function on particular classes.)
(defmethod initialize-instance :after ((self account-interface) &key)
(with-slots (account-ref balance-field) self
(when account-ref
(setf (capi:display-pane-text balance-field)
(format nil "~A" (op:balance account-ref))))))
Here, we encounter our first example of invoking a CORBA operation on a CORBA object. The Common Lisp variable
account-ref
, of class
BankingDemo:account
, contains a proxy for a CORBA
account
object on the server. The application
(op:balance account-ref)
invokes a stub method specialized on the proxy's class. The stub method forwards the request across the ORB to the actual object on the server.
The request is executed on the object in the server and the result passed back across the ORB to the stub method, which returns the value to the client as a
corba:long
. This value is then used to set the initial value of the
balance
field.
We can initialize the interface for a checking account in a similar way:
(defmethod initialize-instance :after (
(self checking-account-interface) &key)
(with-slots (account-ref limit-field) self
(when account-ref
(setf (capi:display-pane-text limit-field)
(format nil "~A" (op:limit account-ref))))))
Inheritance ensures that the method on
account-interface
is called which registers the interface and sets up its
balance
field; a call to the
op:limit
stub determines the initial value of its
limit
field.
For convenience, we define a generic function
make-account-frame
that makes the correct class of frame for a given
account
object reference:
(defmethod make-account-frame ((self BankingDemo:account)
&key bank-interface title)
(push-new-item bank-interface
title
(make-instance 'account-interface
:account-ref self
:account-name title
:owner bank-interface)))
(defmethod make-account-frame ((self BankingDemo:checkingAccount)
&key bank-interface title)
(push-new-item bank-interface
title
(make-instance 'checking-account-interface
:account-ref self
:account-name title
:owner bank-interface)))
These methods simply dispatch on the class of the object reference to make an
account-interface
or
checkingAccount-interface
as appropriate.