object scripts
Geoff Canyon
gcanyon at inspiredlogic.com
Sun Feb 26 14:41:48 EST 2006
On Feb 26, 2006, at 10:08 AM, Mark Wieder wrote:
> That's sort of what I'm doing now. Inheritance is actually fairly
> easy. The hard part is that scripts are associated with screen objects
> - you can't have objects that don't have screen representations.
>
> For instance, I have a linked-list class that I use as a base class
> for other classes. But there's no way to inherit the script without
> making both the base and sub classes scripts of buttons or something
> else. And adjusting front- and back- scripts accordingly. And paying
> *very* careful attention to the message path.
Agreed. What I had envisioned would do nothing to implement abstract
classes/objects, except inasmuch as you could have as many hidden
objects as you like. See below:
On Feb 26, 2006, at 10:39 AM, Dan Shafer wrote:
> Interesting implementation. My guess is that it's not going to be very
> efficient in execution, but perhaps we just throw more hardware at it
> as someone else has suggested.
>
> The real problem for me is that it's not possible to create subclasses
> of components. The recently departed Xavier spent a lot of years
> trying to get that to work and although he came very close to a decent
> simulation, actually implementing objects in a language not designed
> for them leads to things like C++, which was procedural C with objects
> glued clumsily to its side.
Subclassing components is what I had in mind. For those who weren't
around the last time this came up ;-) the issue is roughly this
(anyone who disagrees feel free to jump in):
=====================================================================
In Revolution, the object hierarchy is container based. A button (or
any control) can inherit behavior from any group that contains it,
from the card it is on, from the stack it is in, or from the
mainstack it is part of. So, for example, it would be easy to put
together a set of radio buttons labeled "red," "green," and "blue,"
and display an answer dialog with which button is clicked. To do
this, group the buttons, and put in the group script:
on mouseUp
answer the short name of the target
end mouseUp
Since all the radio buttons are in the group (and only the radio
buttons) this works.
But suppose you wanted another set of buttons on another card to do
the same thing? The standard method of accomplishing this would be to
group those buttons as well, and put the exact same script in their
group.
This is a Bad Thing. If you later decide that the answer dialog
should be a warning dialog, you have to remember that the routine is
in two places, and change them both. For two groups it's not a big
deal, but what if you have ten such groups, or a hundred?
The alternative is to go to the point where the buttons share an
ancestor: the stack script. But there are many buttons and other
controls that _don't_ need to display this dialog. So you end up with
something like this in the stack script:
on mouseUp
if the uDisplayName of the target is true then
answer the short name of the target
else if the uSomethingElse of the target is true then
-- do something else
else -- you get the idea -- it's ugly
There may be a better way to do this outside of traditional object
oriented techniques. I haven't ever tried to implement something like
this before.
The Object Oriented way to do this is to define a new group type:
alertGroup, say. In the definition of the alertGroup, you include the
original mouseUp handler. Then any time you need a group that has
this behavior you declare it to be an alertGroup (instead of a
generic group). In every way it acts like a normal group, but when a
control in it is clicked, it displays a dialog with the name of the
control. If you need to make it a warning dialog, change the class
definition and the behavior everywhere changes. It's really much the
same as the non-oo solution above, but without you the coder having
to do all the work.
==================================================================
All of that said, I believe I have object-oriented code in this
limited sense working. If I do say so myself, it's simple, has low
overhead, consists of less than 100 lines of code, and might be
completely useless ;-)
Right now it supports classes but no inheritance. I should have that
complete in a few minutes, at which point I'll upload version .1
regards,
Geoff
More information about the use-livecode
mailing list