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
_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to