Esta clase, que es subclase de hObject, define los atributos y comportamiento básico que tendrán todos los objetos de la hiperistoria programados por el usuario, incluso el de los contextos y links, los cuales son subclases de ella.
4.8.1 - Atributos.
Los atributos y métodos de esta clase son los siguientes:
(hObject) id : string
Implementación.
(hObject) i c l : string
Contiene el nombre de la subclase definida por el usuario de la cual el objeto en cuestión es instancia o 'ENTITY' si el objeto es instancia directa de esta clase.
(hObject) _ intem alld : word
Identificación interna dada por el Kemel de la hlperhistoria al crearlo (hObject) m y C o n te x t: hO bject
Referencia al contexto en el que esta incluido la objeto (hObject) _m yO bjects : pC ollection
Colección de los objetos de la hlperhistoria que están tomados por la entidad. (hObject) _ in d ic e C u rr: w ord
Este atributo tiene el mismo uso que en la superclase. (hObject) _ s e n d ln it: boolean
True o False según la entidad que es subclase implemente en su comportamiento una regla cuyo encabezado es sys_init. o w n e r : hO bject
Referencia al objeto de la hiperhistoria que es "dueño" de la entidad, este atributo toma valor cuando otra entidad toma a esta.
_bloques : dlction ary
Este diccionario contiene como claves los nombres de los bloques definidos en el comportamiento de la clase. _ h ijo s : plntC ollection
Colección de enteros que representa el primer bloque anidado en cada bloque de comportamiento.
A cada bloque le corresponde una posición en la colección, la cual se corresponde con las posiciones de los nombres de los bloques en el atributo anterior, el valor que tiene la colección en esa posición es el número del primer bloque anidado en el bloque correspondiente a esa posición.
En caso de que un bloque no tenga bloques aqidados el valor en la colección, en la posición correspondiente a ese bloque es -1.
_padres : plntC ollection
Colección de enteros que representa, por cada bloque, el numero del bloque que lo engloba, esta colección tiene la misma cantidad de elementos que la anterior, ya que cada elemento se corresponde con un bloque.
En caso del bloque mas externo, que no tiene bloque que lo englobe, el valor correspondiente a su posición es -1. _sigulentes : plntC ollection
Colección de enteros que representa el siguiente bloque, dentro del mismo nivel de anidamiento y siempre que el bloque inmediatamente superior al bloque siguiente sea el mismo que el actual.
En caso del último bloque, el valor que toma la posición correspondiente a esta es -1. La cantidad de elementos de esta colección siempre será igual que las dos anteriores. _flags : pB oolC ollection
Colección de valores lógicos que Indica si los bloques correspondientes a la cada posición están o no activos.
Estas cuatro colecciones vistas se usan para mantener la estructura de bloques del comportamiento de cada objeto de la hiperhistoria Implementado por el usuario.
Estas colecciones serán inicializadas por cada objeto de la hiperhistoria que implemente un comportamiento y a la inicialización agregarán los datos de los bloques de la superclase correspondiente, luego serán usadas en todas las subclases de entidad de la misma manera, pero la cantidad de elementos que estas contengan al momento de la ejecución ira aumentando a medida que se baje en la jerarquía ya que cada subclase heredará los valores correspondientes a los bloques de las superclases y agregará a estos los valores correspondientes a los bloques que tenga definidos.
Dada una clase y una subclase de ésta, veamos un ejemplo de como serán los valores que tomen estas colecciones en las instancias de la clase y de la subclase.
Implementación
Supongamos tener la clase A con la siguiente estructura de bloques: ¡ BLOCK main BLOCK A1 END BLOCK A2 END END
Y luego la clase B, la cual es subclase de A con la siguiente estructura de bloques:
BLOCK main BLOCK A1 BLOCK B11 END BLOCK B12 END END BLOCK B2 END END
Esta subclase hereda la estructura de bloques de la anterior y agrega a esta lo siguiente, dentro del bloque A 1, los bloques B11 y B12 y luego del bloque A1 el bloque B2.
Para la clase A, la colección tendrá tres elementos, y será inlcializada como sigue
Bloque Posición Hijos Padres Siguientes
main 0 1 -1 -1
A1 1 -1 0 2
A2 2 -1 0 -1
Para la clase B se mantendrán las entradas correspondientes a la superclase, ya que hereda la estructura de bloques de esta, y agregará las suyas, modificando algunos valores para que las colecciones reflejen la nueva estructura, éstas, entonces, quedarán como sigue:
Bloque Posición Hijos Padres Siguientes
main 0 1 -1 -1 A1 1 3 0 5 A2 2 -1 0 -1 B11 3 -1 1 4 B12 4 -1 1 -1 B2 5 -1 0 2
Implementación.
Al iniciar la hiperhistoria y después de inicializar las colecciones se activarán los flags correspondientes, siguiendo el esquema de activación de bloques visto en el capitulo anterior.
Mas adelante veremos como funcionan los métodos que activan y desactivan los bloques representados en estas colecciones.
4.8.2 - Métodos.
Ahora veremos cuales son los métodos implementados en la clase entity.
qetExtem alC ontext: hObject; Parámetros:
Este método no recibe parámetros. Acción:
Este método no hace nada. Retorna:
Retoma el contexto en el que esta incluido el objeto o NIL en caso de que este tomado por otra entidad.
qetContext: hObject; Parámetros:
Este método no recibe parámetros. Acción:
Este método no hace nada. Retoma:
Retoma el contexto en el que esta incluido el objeto o NIL en caso de que este tomado por otra entidad. Este método hace lo mismo que el anterior, cambiará su función en la subclase Context
_aceptaEvento( _ e v e n t: _tEvent; sender : hO bject;var _param s : string ):boolean; Parámetros:
_ e v e n t: _tEvent Nombre del evento enviado a la entidad,
sender : hO bject Objeto que envía el evento.
_param s : string Parámetros del evento.
Acción:
Maneja los eventos predefinidos para las entidades en caso que ninguna subclase de esta lo haga, los eventos que maneja y las acciones que realiza para cada uno son las siguientes:
GETNAME( var n : string )
Devuelve en el parámetro el nombre del objeto receptor del evento. GETCLASS( var n : string )
Devuelve en el parámetro el nombre de la clase del objeto receptor del evento. GETCONTEXT( var c : h O b je c t)
Devuelve en el parámetro el contexto en el que esta incluido el objeto receptor del evento. GETOWNER( var e : h O b je c t)
Devuelve en el parámetro la entidad que tiene tomado al objeto receptor del evento. OBJFIRST
Posiciona un puntero interno en el primer elemento de la lista de objetos tomados por la entidad receptora del evento.
OBJNEXT
Mueve el puntero mencionado para que apunte al próximo elemento en la lista de objetos tomados por la entidad. OBJCURR( var o : h O b je c t)
Implementación.
OBJISLAST( var ultim o : boolean )
Devuelve en el parámetro el valor true en caso de que el objeto apuntado por el puntero interno sea el último de la lista.
TAKEBY( o : h O b je c t)
Hace que el objeto pasado como parámetro del evento agregue al objeto receptor del evento a su lista de objetos internos, esto se interpreta como que el objeto pasado como parámetro toma al objeto receptor del evento. El nuevo dueño del objeto receptor del evento será el objeto pasado como parámetro.
El nuevo contexto del objeto receptor del evento será NIL.
Al ejecutarse este evento, se envía al contexto en el que está incluido el objeto receptor el evento OTAKED y manda como el otro objeto involucrado ( el objeto receptor de este evento lo verá en el atributo sender ) a si mismo. Este mensaje se envía de manera asincrónica.
LEAVEBY( o : h O b je c t)
Hace que el objeto pasado como parámetro elimine de su colección intema al objeto receptor del evento, esto se interpreta como que el objeto pasado como parámetro suelta al objeto receptor del evento.
El atributo owner que representa al objeto que tiene tomado al receptor se hace NIL.
El atributo myContext se asigna con el contexto en el que esta incluido el objeto pasado como parámetro, o sea, el que lo soltó.
Al ejecutarse este evento, se envía al contexto en el que están incluidos los objetos involucrados el evento
OLEAVED, que este podrá acceder a través del atributo sender. Este evento se envía de manera asincrónica.
Retorna:
True, en caso de que el evento recibido sea alguno de los mencionados, en caso contrario, retoma el valor que devuelva la función _aceptaEvento implementada en la clase hObject.
activarBloque( s : string ); Parámetros:
s : string nombre del bloque que se quiere activar
Acción:
Desactiva todos los bloques que pudieran estar activos en ese momento y activa el bloque cuyo nombre es pasado como parámetro y también hace la activación de los demás bloques, los que engloban al receptor y los englobados por este, según el esquema de activación de bloques mencionado en el capítulo anterior.
Esto último lo hace usando los dos métodos que explicamos luego de este. Retorna:
Nada
,activaBajando( n : in te g e r); Parámetros:
n : integer Indice en la colección de bloques del bloque que se quiere activar.
Acción:
Realiza la activación del bloque cuyo índice en las colecciones internas es pasado como parámetro y vuelve a llamar a este método, de manera recursiva, para activar el primer bloque interno al recibido como parámetro.
Retorna: Nada
_activaSubiendo( n : in te g e r); Parámetros:
n : integer Indice en la colección de bloques del bloque que se quiere activar.
Acción:
Activa el bloque cuyo índice corresponde al numero pasado como parámetro y si el bloque en cuestión esta englobado por otro, se hace la llamada, de manera recursiva al mismo método pero para activar este segundo bloque.
Implementación.
Retorna: Nada
bloqueSiguiente( activo : in te g e r): string ; Parámetros:
s : string nombre del bloque que se quiere activar
Acción: Nada Retorna:
El nombre del bloque siguiente al bloque correspondiente al pasado como parámetro, esto según la definición de bloque siguiente dada en el capitulo anterior.