ES2230900T3 - Referencia de un procedimiento en un programa basado en objetos. - Google Patents

Referencia de un procedimiento en un programa basado en objetos.

Info

Publication number
ES2230900T3
ES2230900T3 ES99955342T ES99955342T ES2230900T3 ES 2230900 T3 ES2230900 T3 ES 2230900T3 ES 99955342 T ES99955342 T ES 99955342T ES 99955342 T ES99955342 T ES 99955342T ES 2230900 T3 ES2230900 T3 ES 2230900T3
Authority
ES
Spain
Prior art keywords
class
delegate
addition
instance
computer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
ES99955342T
Other languages
English (en)
Inventor
Peter H. Golde
Anders Hejlsberg
Chad W. Royal
Tracy C. Sharpe
Michael J. Toutonghi
Edward H. Wayt
Scott M. Wiltamuth
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Application granted granted Critical
Publication of ES2230900T3 publication Critical patent/ES2230900T3/es
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Un producto de programa de ordenador basado en objetos, que comprende un código de programa de ordenador, realizado en una forma legible por ordenador, sobre un portador físico (22; 24; 26; 28), en el cual el código fuente del programa causa que un ordenador (20) lleve a cabo las etapas de representar una instancia y un primer método de una clase por medio de un valor delegado, que puede asignarse a variables y transferirse desde un procedimiento a otro, y de invocar al primer método llamando a un segundo método de una instancia de una clase, utilizando el valor delegado, en el cual los parámetros proporcionados al segundo método se proporcionan al primer método, y la lista de parámetros del segundo método coincide con la lista de parámetros del primer método; y en el cual, además, el primer método es identificado por nombre y por la coincidencia de la lista de parámetros y del tipo del resultado del primer método con la lista de parámetros y el tipo de resultado declarado para la clase.

Description

Referencia de un procedimiento en un programa basado en objetos.
Campo técnico de la invención
Esta invención se refiere generalmente a los lenguajes de ordenador y, más en particular, a un método y un dispositivo para programar en lenguajes basados en objetos u orientados a objetos.
Antecedentes de la invención
Los lenguajes de programación de alto nivel permiten a los desarrolladores descomponer el código fuente en trozos más pequeños. En lenguajes no orientados a objetos, la unidad más pequeña de descomposición es un procedimiento o función. En lenguajes orientados a objetos, la unidad más pequeña de descomposición es, típicamente, un método en una clase.
Muchos lenguajes de programación modernos también tienen mecanismos que permiten a los desarrolladores tratar estas unidades de descomposición como valores, que pueden utilizarse como valores (transferirse, almacenarse en estructuras de datos, etc.) y también emplearse para "llamar" o "invocar" al trozo de código que el valor representa. Lenguajes distintos proporcionan mecanismos distintos.
En los lenguajes de programación no orientados a objetos, la mejor conocida de estas estructuras es el puntero de función hallado en C y C++. En los lenguajes de programación funcionales (LISP, ML, Scheme, etc.) este estilo de programación es común. En los lenguajes de programación orientados a objetos no se ha desarrollado ningún mecanismo adecuado con este fin.
A fin de que un sistema de programación (lenguaje y entorno de tiempo de ejecución) pueda permitir a los desarrolladores crear y utilizar referencias a métodos, la presente invención aborda los siguientes objetivos de diseño:
a)
definir una entidad que defina la forma del método al cual referirse;
b)
obtener una referencia a un método;
c)
almacenar esta referencia en estructuras de datos arbitrarias;
d)
transferir la referencia a código escrito por otros;
e)
permitir la invocación del método a cualquiera que tenga la referencia al método; y
f)
permitir a quien tenga una referencia al método determinar el objeto y el método de destino a los cuales se refiere.
Además, el sistema de programación de la presente invención logra los objetivos precedentes en un entorno de tipos de datos fuertes, haciendo posible que:
a)
los desarrolladores conozcan antes los problemas de falta de coincidencia de tipos (en tiempo de compilación), y no después (en tiempo de ejecución), y
b)
las herramientas de desarrollo presenten información a los desarrolladores acerca de la forma de los componentes que utilizan delegados.
Soluciones anteriores a los problemas asociados
Diversos productos emplean punteros de función a la manera de C y C++, tales como el Visual C++, el Visual Basic y el Visual Basic A de Microsoft®, todos ellos disponibles en la Corporación Microsoft. La Interfaz de Programación de Aplicaciones de Windows® hace también un extenso uso de punteros de función. Los punteros de función de esta índole son deficientes, por diversas razones:
a)
no ofrecen protección con respecto a los tipos, y producen asignaciones forzadas de tipos;
b)
no disponen de seguridad - un puntero de función es sólo un puntero, que puede ser alterado inadvertidamente e invocado luego, produciendo una caída del sistema; y
c)
no permiten acceder al objeto y método de destino.
Java VM de Microsoft® y los productos asociados tienen un sistema "Reflejo del Núcleo de Java" que proporciona una forma primitiva de referencia a métodos. Un desarrollador puede obtener una instancia de java.lang.reflect.Method. Esta forma de referencia es de enlace tardío inherente y, por lo tanto, ineficiente.
Resumen de la invención
Según un aspecto de la presente invención, se proporciona un producto de programa de ordenador según la reivindicación 1.
Según otro aspecto de la presente invención, se proporciona un sistema de programación basado en objetos, según la reivindicación 8.
Según un aspecto adicional de la presente invención, se proporciona un método para programar un ordenador según la reivindicación 19.
Breve descripción de los dibujos
La Figura 1 ilustra un diagrama en bloques de los principales componentes de la presente invención.
La Figura 2 ilustra las plataformas y soportes de distribución aplicables a la presente invención.
La Figura 3 es un ejemplo de programa de ordenador en J++ según la presente invención.
Las Figuras 4 y 5A ilustran ejemplos de declaraciones de un delegado de enlace temprano, según la presente invención.
La Figura 5B ilustra un ejemplo de construcción de un delegado de enlace tardío, basado en un nombre de método de tipo cadena de caracteres.
La Figura 6 es un ejemplo de definición de la clase Delegate según la presente invención.
La Figura 7 es un ejemplo de definición de la clase DelegateMulticast.
La Figura 8 ilustra un ejemplo de realización que extiende el Visual J++ de Microsoft® para incluir una interfaz com.ms.lang.Callable.
La Figura 9 ilustra un ejemplo de clase de sucesos según la presente invención.
La Figura 10 ilustra un ejemplo de código de procesamiento de sucesos según la presente invención.
La Figura 11 ilustra un ejemplo de código de procesamiento de sucesos según la presente invención.
La Figura 12 ilustra un ejemplo de código de procesamiento de sucesos según la presente invención.
La Figura 13 ilustra un ejemplo de código de procesamiento de sucesos según la presente invención.
Las Figuras 14A - 14B ilustran un ejemplo de programa de procesamiento de sucesos que emplea delegados según la presente invención.
Las Figuras 15A - 15B ilustran un ejemplo de programa de procesamiento de sucesos según la presente invención.
La Figura 16 ilustra un ejemplo de un programa de procesamiento de sucesos según la presente invención.
La Figura 17 ilustra una definición de la clase Event según la presente invención.
La Figura 18 ilustra un ejemplo de definición de una declaración de un procesador de sucesos según la presente invención.
La Figura 19 ilustra un ejemplo de definición de una clase CancelEvent según la presente invención.
La Figura 20 ilustra una declaración de un procesador de sucesos según la presente invención.
Descripción detallada de la invención
En la siguiente descripción detallada de las realizaciones preferidas, se hace referencia a los dibujos adjuntos, que forman parte de la misma, y en los cuales se muestran, a manera de ilustración, realizaciones específicas en las cuales la invención puede ponerse en práctica. Se entiende que pueden utilizarse otras realizaciones y efectuarse cambios estructurales sin apartarse del campo de la presente invención.
Introducción
La presente invención proporciona un mecanismo, denominado aquí un "delegado", para referirse a un método en la programación basada en objetos. Mientras que un puntero de función contiene una referencia a una función, un delegado contiene una referencia a un método. Los dos difieren en que un puntero de función contiene sólo una referencia (una función), mientras que un delegado contiene una referencia a un objeto y un método de ese objeto.
Una propiedad útil de un delegado, según se describe aquí, es que el delegado no conoce, ni le importa, el tipo (clase) del objeto al que se refiere. En cambio, todo lo que importa es que la lista de parámetros del método referenciado sea compatible con el delegado. Esto hace que los delegados sean bastante útiles para el empleo de notificación "anónima" - un llamador que invoca a un delegado no necesita saber exactamente qué clase o miembro está siendo invocado.
De forma similar a un puntero de función, un delegado es un valor. Como otros valores, puede ser asignado a variables, transferido desde un procedimiento a otro, etc. Un delegado también puede ser empleado / aplicado / llamado. Cero o más argumentos pueden transferirse al delegado al realizar esta operación.
Los delegados difieren de los punteros de función en que los delegados pueden ser de tipos protegidos, o fuertes. Además, mientras que los punteros de función son independientes del contexto - cuando una función es invocada a través de un puntero de función, esta función no tiene más contexto que el transferido a través de los parámetros -, un delegado lleva el contexto consigo. Cuando se invoca un método a través del delegado, la invocación tiene lugar sobre el objeto referenciado por el delegado y, de esta manera, proporciona al método un contexto conocido.
Como se describirá más en detalle más adelante, la invención toma múltiples formas distintas, según se ilustra en la Figura 1. Como se muestra allí, el ejemplo de realización de los delegados descritos aquí está realizado en forma de un lenguaje de programación 10, un programa de ordenador 12, un compilador 14, software intérprete 16 de Java VM y un modelo de sucesos 18. Como se ilustra en la Figura 2, estas diversas realizaciones pueden ejecutarse sobre un sistema informático 20 (que incluye componentes informáticos convencionales tales como, pero no limitados a, una CPU [Unidad Central de Proceso], almacenamiento, memoria, teclado, ratón); por ejemplo, pero no como limitación, un ordenador personal compatible con IBM; y almacenarse o realizarse de otra manera, en una forma interpretable por una máquina, en diversos medios de distribución, tales como controladores de discos rígidos 22, disquetes 24, cederrones 26, o como una transmisión electrónica de datos 28.
Ejemplo de realización de la invención en J++
El siguiente ejemplo de realización de la invención describe una implementación de delegados en Visual J++ de la Corporación Microsoft®, versión 6.0. Sin embargo, la presente invención no está limitada de manera alguna al lenguaje J++, sino que es extensamente aplicable a cualquier sistema de programación orientado a objetos, tal como el C++, o a un sistema de programación basado en objetos, tal como el Visual Basic de Microsoft®. Según se utiliza aquí, el término "orientado a objetos" significa un lenguaje de programación que está basado en objetos y que brinda a la vez soporte a la herencia. El término "basado en objetos" significa un lenguaje de programación en el cual el código fuente se organiza en objetos, pero que no necesariamente brinda soporte a la herencia, tal como el Visual Basic de Microsoft®.
Antes de describir la invención en detalle, se presenta en la Figura 3 un ejemplo sencillo de un programa de ordenador 30 en J++ que utiliza delegados, en el cual una instancia del delegado encapsula un método sobre la instancia. En este caso, se llama al método "hola" utilizando un delegado "f". Además, la declaración del delegado define las clases de métodos que el delegado es capaz de encapsular.
El ejemplo de programa de la Figura 3 ilustra cómo se instancia una instancia f del delegado SimpleDelegate ("f = new SimpleDelegate (o.hola)"), y cómo se invoca a continuación ("f.invoke()"). Como se describe más en detalle más adelante, a fin de ser válido y ejecutable, el tipo del delegado SimpleDelegate debe coincidir con el tipo del método "hola" referenciado. En este caso, ni "hola" ni SimpleDelegate requieren ningún parámetro de entrada y ambos tienen salida vacía. Como también se explica más adelante, este requisito hace que los delegados tengan tipos protegidos.
Más adelante se expone una descripción de los delegados, como una extensión del lenguaje J++, según se ha implementado en la versión 6.0 del "Visual J++ de Microsoft®. La Especificación del Lenguaje Java, según lo publicado por Sun Microsystems, Inc". La Especificación del Lenguaje Java se menciona aquí alternativamente como "ELJ" y, además, es citada aquí parcialmente.
Declaraciones de Delegados en Ejemplo de Realización en J++
Una declaración de delegado, según el ejemplo de realización de la invención expuesto aquí, especifica una nueva clase que deriva de Delegate o de MulticastDelegate. La DeclaracionDelegado tiene la forma:
ModificadoresDelegado_{opt} delegate TipoResultado Identificador (ListaParámetrosFormales_{opt}) Throws_{opt}
Las producciones relevantes para la declaración de clase son:
ModificadoresClase_{opt} class Identificador Super_{opt} Interfaces_{opt} CuerpoClase
Una DeclaracionDelegado da como resultado una clase que, si se declara utilizando la sintaxis del lenguaje Java del ejemplo actual, tiene los siguientes atributos:
1)
Para ModificadoresClase_{opt}, la declaración de clase tiene ModificadoresDelegado_{opt}, más los siguientes modificadores adicionales, suponiendo que puedan especificarse en el contexto dado: static, final.
2)
Para Identificador, tiene el Identificador de la DeclaraciónDelegado.
3)
Para Super_{opt}, tiene "extends com.ms.lang.MulticastDelegate" si se especifica el modificador multicast y "extends com.ms.lang.Delegate" si se omite el modificador multicast.
4)
Para Interfaces_{opt}, tiene "".
Se infiere que si un delegado está declarado en un paquete con nombre (véase \NAK 7.4.1 de la ELJ), con un nombre P completamente calificado (véase \NAK 6.7 de la ELJ), entonces el delegado tiene el nombre P.Identificador, completamente calificado. Si el delegado está en un paquete innominado (véase \NAK 7.4.2 de la ELJ), entonces el delegado tiene el nombre Identificador, completamente calificado. En el ejemplo de la Figura 4, el delegado EmptyMethod (32) se declara en una unidad de compilación sin ninguna sentencia de paquete y, por lo tanto, EmptyMethod es su nombre completamente calificado, mientras que en el ejemplo de código fuente 34 de la Figura 5A el nombre completamente calificado del delegado EmptyMethod es vista.EmptyMethod.
En el presente ejemplo de realización de la invención, el compilador 14 (ejecutable en una plataforma informática digital) genera un error de tiempo de compilación:
1)
si el Identificador que nombra a un delegado aparece como el nombre de cualquier otro tipo de delegado, tipo de clase o tipo de interfaz declarado en el mismo paquete (Véase \NAK 7.6 de la ELJ); o bien
2)
si el Identificador que nombra a un delegado también es declarado como un tipo por una declaración de importación-de-tipo-individual (Véase \NAK 7.5.1 de la ELJ) en la unidad de compilación (Véase \NAK 7.3 de la ELJ) que contiene a la declaración del delegado.
Ámbito de un Nombre de Tipo de Delegado
El Identificador en una declaración de delegado especifica el nombre del delegado. Este nombre de delegado tiene como su ámbito (Véase \NAK 6.3 de la ELJ) todo el paquete en el cual se declara el delegado.
Modificadores de Delegado
Una declaración de delegado puede incluir modificadores de delegado. Los ModificadoresDelegado pueden estar ausentes o ser uno de los siguientes: public [público] private [privado] static [estático] final multicast [multiforme].
Si dos o más modificadores de delegado aparecen en una declaración de delegado, es usual, entonces, aunque no requerido, que aparezcan en un orden consistente con el mostrado más atrás en la producción para ModificadoresDelegado.
Una declaración de delegado que incluye el modificador multicast [multiforme] debe tener un TipoResultado con valor void [vacío]; en caso contrario, ocurre un error de compilación.
El modificador de acceso public [público] se expone en \NAK 6.6 de la ELJ. El compilador de este ejemplo de realización de la invención produce un error de tiempo de compilación si:
1)
se utiliza más de un modificador de delegado;
2)
el mismo modificador aparece más de una vez en una declaración de delegado, o una declaración de delegado tiene más de un miembro del par de modificadores de acceso public [público] y private [privado]; o bien
3)
el modificador private [privado] aparece en una declaración de delegado que no está anidada dentro de una clase.
Los delegados son implícitamente estáticos. Está permitido, pero se desaconseja enfáticamente como cuestión de estilo, especificar redundantemente el modificador static [estático] dentro de una declaración de delegado. Además, los Delegados son implícitamente final [finales]. Está permitido, pero se desaconseja enfáticamente como cuestión de estilo, especificar redundantemente el modificador final dentro de una declaración de delegado.
Según el actual ejemplo de realización, las definiciones de delegados pueden aparecer en todo sitio donde aparecen definiciones de clase. Igual que una definición de clase, una definición de delegado puede anidarse dentro de una definición de clase. Además, los Delegados siempre son de nivel supremo.
Los miembros de un delegado incluyen a los miembros heredados de la clase básica (ya sea clase Delegate o MulticastDelegate), más un método de invocación especial, creado automáticamente (descrito más adelante) que puede emplearse para invocar el método encapsulado. Una declaración de delegado también se obtiene como resultado en una clase con un constructor especial, automáticamente generado.
El Método Invoke
Los miembros de un delegado incluyen un método de invocación automáticamente creado, que puede emplearse para invocar el método encapsulado. La signatura y el tipo devuelto por el método Invoke están determinados por la declaración de delegado. Específicamente, la signatura del método Invoke es:
TipoResultado invoke (ListaParámetrosFormales_{opt}) Throws_{opt}
donde TipoResultado, ListaParámetrosFormales (en caso de haberla) y Throws (en caso de haberlo) son los de la declaración del delegado.
Instanciación de Delegado
Los delegados tienen dos constructores, según lo siguiente:
1)
Un constructor de "instancias" cuya forma está definida por la clase básica Delegate. Los argumentos para este constructor, un Objeto y un nombre de método en una Cadena de Caracteres, combinados con el tipo del delegado, especifican unívocamente un miembro del objeto indicado que coincide con la definición del delegado. El nuevo delegado construido encapsula este método.
2)
Un constructor especial "designador de método" que permite que la mayor parte de la resolución del método se lleve a cabo en tiempo de compilación en lugar de durante la ejecución. El delegado designador de método no se expone a través del Reflejo del Núcleo de Java.
Los constructores de clase e instancia no son especiales en manera alguna; se explican en detalle en la especificación de la clase básica Delegate expuesta aquí. Se utiliza una expresión designadora de método para indicar un método de clase o instancia con el fin de la instanciación del delegado.
La ExpresiónCreaciónInstanciaClase adopta la forma
new TipoClase (ListaArgumentos_{opt}) ExpresiónInstanciaciónDelegado
La ExpresiónInstanciaciónDelegado adopta la forma:
new TipoDelegado (DesignadorMétodo)
El DesignadorMétodo adopta la forma:
NombreMétodo
Primary.Identificador
super.Identificador
El TipoDelegado es
una clase que deriva de com.ms.lang.Delegate
Un designador de método no es suficiente para designar un método. Para designar un método específico, en lugar de (potencialmente) un conjunto de métodos, es necesario remitirse al tipo devuelto y a la signatura (número y tipos de argumentos) del delegado que se está instanciando con el designador de método. Por este motivo, el DesignadorMétodo y la forma de especificación de la nueva instancia se describen como una única unidad.
La instanciación de delegados emplea reglas de búsqueda que son similares a las de las expresiones de invocación de métodos (Véase \NAK 15.11 de la ELJ). La designación de un método es compleja debido a la posibilidad de sobrecarga del método y de prevalencia de métodos de la instancia. La determinación del método que será invocado por una expresión de invocación de método involucra varias etapas adicionales. Se describen a continuación las etapas involucradas en la instanciación de delegados, tanto en tiempo de compilación como en tiempo de ejecución, según el actual ejemplo de realización de la(s) invención(es).
Delegados de Enlace Temprano y de Enlace Tardío
En el ejemplo de la Figura 3, la instanciación "f = new SimpleDelegate(o.hola)" es un delegado de enlace temprano, en el cual el método "hola" es conocido en tiempo de compilación. En algunos casos, el método al cual debería enlazarse el delegado no se conoce cuando se compila el programa. Por ejemplo, el usuario de un entorno de desarrollo interactivo podría especificar el nombre de un método para el prototipado de un programa, o el nombre de un método a invocar podría calcularse o ingresarse de alguna otra manera. En este caso, puede construirse una instancia de un delegado utilizando un constructor de dos argumentos.
El primer argumento del constructor especifica el objeto sobre el que debería invocarse el método. El segundo argumento del constructor especifica el nombre del método. El objeto especificado en el primer argumento se verifica para cerciorarse de que tiene un método del nombre indicado, con la misma signatura (esto es, el tipo devuelto y los tipos de argumentos) con la cual fue declarada la clase delegate. De no ser así, ocurre una excepción; si lo es, se construye y devuelve un nuevo objeto delegado.
La instanciación de tal delegado "de enlace tardío", según lo descrito inmediatamente antes, adopta la forma, por ejemplo, de "g = new SimpleDelegate(o,"hola")", en la cual el método "hola" es una cadena de caracteres que puede definirse durante la ejecución del programa. En el caso del delegado de enlace tardío, la invocación adopta la forma de "g. dynamicInvoke (Objeto \talloblong argumentos)". A manera de ilustración, el ejemplo de programa 36 de la Figura 5B construye un delegado de enlace tardío basado en un nombre de método de tipo cadena de caracteres.
Operación del Compilador
Como se ha observado anteriormente, el ejemplo de realización de la presente invención incluye un compilador 14. Se requieren varias etapas para procesar una expresión de instanciación de delegado en tiempo de compilación. En primer lugar, el compilador debe determinar qué clase o interfaz buscar. En segundo lugar, el compilador debe buscar un método que sea coincidente y accesible. En tercer lugar, el compilador debe verificar que el método sea adecuado. Estos procesos se describen en más detalle más adelante.
Etapa 1 de Tiempo de Compilación: Determinar la Clase o Interfaz a Buscar
La primera etapa al procesar una expresión de instanciación de delegado en tiempo de compilación es determinar el nombre del método, y qué clase o interfaz verificar en cuanto a las definiciones de métodos de ese nombre. Hay varios casos a considerar, según la forma del designador de método, según lo siguiente
1)
Si la forma es NombreMétodo, entonces hay dos subcasos:
a)
Si es un nombre simple, es decir, sólo un Identificador, entonces el nombre del método es el Identificador, y la clase o interfaz a buscar es aquella cuya declaración contiene el designador del método.
b)
En todos los demás casos, el nombre calificado tiene la forma NombreCampo.Identificador; en tal caso, el nombre del método es el Identificador y la clase o interfaz a buscar es el tipo declarado del campo nombrado por el NombreCampo.
2)
Si la forma es Primary.Identificador, entonces el nombre del método es el Identificador y la clase o interfaz a buscar es el tipo de la expresión Primary.
3)
Si la forma es super.Identificador, entonces el nombre del método es el Identificador, y la clase a buscar es la superclase de la clase cuya declaración contiene la instanciación del delegado. Se produce un error de tiempo de compilación si tal designador de método aparece en una interfaz, o en la clase Object, o en un método estático, un inicializador estático, o el inicializador para una variable estática. Se infiere que un designador de método de esta forma puede aparecer sólo en una clase que no sea Object, y sólo en el cuerpo de un método de instancia, el cuerpo de un constructor, o un inicializador para una variable de instancia.
Etapa 2 de Tiempo de Compilación: Determinar Signatura del Método
La segunda etapa busca la clase o interfaz determinada en la etapa anterior para las declaraciones de método. Esta etapa utiliza el nombre del método indicado y los tipos de los parámetros formales de la definición del delegado para localizar las declaraciones de métodos que sean tanto coincidentes como accesibles, es decir, declaraciones que coincidan con el tipo de los delegados que se están instanciando, y que puedan ser correctamente invocadas desde el contexto de instanciación del delegado. Debido a que las reglas de coincidencia son estrictas, sólo puede haber una tal declaración de método.
Un método coincide con un tipo de delegado, o no. Es posible instanciar una instancia de delegado del tipo T, que encapsula el método M, si y sólo si M coincide con T.
Sea M el método y sea T el tipo del delegado. M coincide con T si y sólo si es verdad todo lo que sigue:
1)
M y T tienen el mismo número de parámetros formales;
2)
El tipo de cada uno de los parámetros de M coincide idénticamente con el tipo de los parámetros de T;
3)
El tipo del resultado de M coincide idénticamente con el tipo del resultado de T; y
4)
En M no hay declaraciones para generar más excepciones verificadas que T. Si M tiene una cláusula "throws" que menciona cualquier tipo de excepción verificada, entonces T debe tener una cláusula "throws", y para cada tipo de excepción verificada enumerada en la cláusula "throws" de M, debe aparecer la misma clase de excepción o una de sus superclases en la cláusula "throws" de T.
Nótese que, debido a que las reglas de coincidencia requieren una coincidencia estricta (tipos idénticos para las listas de parámetros y los tipos devueltos), puede haber a lo sumo un método coincidente para todo destino dado.
La clase o interfaz determinada por el proceso aquí descrito es inspeccionada en busca de una declaración de método que coincida con el tipo del delegado; las definiciones de métodos heredadas de superclases y superinterfaces se incluyen en esta búsqueda. El que una declaración de método sea accesible o no para una invocación de método depende del modificador de acceso (public [público], none [ninguno], protected [protegido] o private [privado]) en la declaración del método y de dónde aparece el designador del método. Si la clase o interfaz no tiene ninguna declaración de método que sea a la vez coincidente y accesible, entonces se genera un error de tiempo de compilación.
Etapa 3 de Tiempo de Compilación: ¿Es adecuado el Método Escogido?
Si hay una declaración de método coincidente y accesible para una expresión de instanciación de delegado, se la llama la declaración de tiempo de compilación para la expresión de instanciación del delegado. Deben realizarse varias comprobaciones adicionales sobre la declaración de tiempo de compilación. Se genera un error de tiempo de compilación si:
1)
El designador de método tiene un NombreMétodo de la forma Identificador, y el designador de método aparece dentro de un método estático, un inicializador estático, o del inicializador para una variable estática;
2)
El designador de método tiene un NombreMétodo de la forma NombreTipo.Identificador.
La siguiente información de tiempo de compilación se asocia entonces con la invocación del método para su empleo en tiempo de ejecución:
1)
Una referencia a la declaración de tiempo de compilación. (El método).
2)
La clase o interfaz que contiene la declaración de tiempo de compilación. (El destino).
3)
La modalidad de invocación, calculada según lo siguiente:
a)
Si la declaración de tiempo de compilación tiene el modificador private [privado], entonces la modalidad de invocación es no virtual.
b)
En caso contrario, si la parte de la invocación del método antes del paréntesis izquierdo es de la forma super.Identificador, entonces la modalidad de invocación es super.
c)
En caso contrario, si la declaración de tiempo de compilación está en una interfaz, entonces la modalidad de invocación es de interfaz.
d)
En caso contrario, la modalidad de invocación es virtual.
Operación en Tiempo de Ejecución
La presente invención proporciona adicionalmente el software intérprete 16 de Java VM (Figura 1) para implementar los delegados de la presente invención. Se requieren varias etapas para procesar una expresión de instanciación de delegado en tiempo de ejecución. En primer lugar, el compilador debe verificar la accesibilidad del tipo y método de destino. En segundo lugar, el compilador debe localizar el método a invocar, teniendo en cuenta la posibilidad de la prevalencia sobre métodos de instancias.
Etapa 1 de Tiempo de Ejecución: Verificar la Accesibilidad del Tipo y del Método
Sea C la clase que contiene la expresión de instanciación del delegado, y sea T la clase o interfaz que contenía la declaración de tiempo de compilación para la expresión de instanciación del delegado, y sea m el nombre del método, según lo determinado en tiempo de compilación.
El software intérprete 16 de Java VM comprueba, como parte del enlace, que el método m aún existe en el tipo T. Si esto no es verdad, entonces se produce una IllegalArgumentException [excepción por argumento ilegal] (que es una subclase de RuntimeException [Excepción de Tiempo de Ejecución]). Si la modalidad de invocación es de interfaz, entonces el software de la máquina virtual 16 debe también comprobar que el tipo de referencia de destino aún implementa la interfaz especificada. Si el tipo de referencia de destino no implementa aún la interfaz, entonces se produce un IncompatibleClassChangeError (Error de Cambio de Clase Incompatible).
El software de la máquina virtual 16 también debe comprobar, durante el enlace, que el tipo T y el método m son accesibles.
Para el tipo T:
1)
Si T está en el mismo paquete que C, entonces T es accesible.
2)
Si T está en un paquete distinto que C, y T es público, entonces T es accesible.
Para el método m:
1)
Si m es público, entonces m es accesible. (Todos los miembros de interfaces son públicos (Véase \NAK 9.2 de la ELJ)).
2)
Si m es protegido, entonces m es accesible si y sólo si T está en el mismo paquete que C, o bien C es T o una subclase de T.
3)
Si m tiene acceso de paquete (valor por omisión), entonces m es accesible si y sólo si T está en el mismo paquete que C.
4)
Si m es privado, entonces m es accesible si y sólo si C es T.
Si T o m no son accesibles, entonces se produce una IllegalAccessException [Excepción por Acceso Ilegal] (Véase \NAK 12.3 de la ELJ).
Etapa 2 de Tiempo de Ejecución: Localizar Método a Invocar
La estrategia para la búsqueda del método depende de la modalidad de invocación. En el presente ejemplo de realización, no es posible encapsular un método estático con un delegado y, por lo tanto, es claro que un método de instancia ha de ser encapsulado por el delegado, y hay una referencia de destino. Si la referencia de destino es nula, se genera una NullPointerException [Excepción por Puntero Nulo] en este punto. En caso contrario, se dice que la referencia de destino se refiere a un objeto de destino y se utilizará como el valor de la palabra clave "this" cuando se invoque al delegado. Las otras cuatro posibilidades para la modalidad de invocación son consideradas luego por el software intérprete 16 de Java VM, según lo siguiente.
Si la modalidad de invocación es no virtual, no se permite la prevalencia. El método m de la clase T es el que se invoca. En caso contrario, la modalidad de invocación es de interfaz, virtual o super, y puede tener lugar la prevalencia. Se utiliza una búsqueda dinámica de método. El proceso de búsqueda dinámica comienza a partir de una clase S, determinada según lo siguiente:
1)
Si la modalidad de invocación es de interfaz o virtual, entonces S es inicialmente la clase efectiva R de tiempo de ejecución del objeto de destino. Si el objeto de destino es una formación, R es la clase Object. (Nótese que para la modalidad de invocación de tipo interfaz, R implementa a T necesariamente; para la modalidad de invocación virtual, R es necesariamente T o bien una subclase de T).
2)
Si la modalidad de invocación es super, entonces S es inicialmente la superclase de la clase C que contiene la instanciación del delegado.
La búsqueda dinámica de método emplea el siguiente procedimiento para buscar en la clase S, y luego en las superclases de la clase S, de ser necesario, el método m:
1)
Si la clase S contiene una declaración de un método llamado m con el mismo descriptor (el mismo número de parámetros, los mismos tipos de parámetros y el mismo tipo de devolución) requerido por la invocación del método, según lo determinado en tiempo de compilación (descrito precedentemente), entonces este es el método que ha de ser encapsulado por el delegado, y el procedimiento termina.
2)
En caso contrario, si S no es T, se realiza este mismo procedimiento de búsqueda utilizando la superclase de S; aquello que produzca es el resultado de esta búsqueda.
Este procedimiento encontrará un método adecuado cuando llegue a la clase T, porque, en caso contrario, una IllegalAccessException [Excepción por Acceso Ilegal] habría sido generada por las comprobaciones descritas anteriormente. Se observa que el proceso dinámico de búsqueda, si bien se describe aquí explícitamente, a menudo se implementará implícitamente.
Etapa 3 de Tiempo de Ejecución: Verificación de Seguridad
En el ejemplo de realización de delegados expuesto aquí, hay procedimientos provistos para asegurarse de que los delegados no se utilizan a fin de subvertir el código fuente fiable. Sin precauciones especiales de seguridad, los métodos no fiables pueden, potencialmente, utilizar delegados a fin de hacer invocar métodos fiables, de tal manera que ninguna clase no fiable aparezca en la pila de llamadas. Bajo la seguridad estándar de Java, el método fiable tendría éxito si no hubiera métodos no fiables en la pila de llamadas; fracasaría potencialmente si el método no fiable original estuviera en la pila de llamadas. Un buen ejemplo es el método java.io.File.delete; si un código fuente no fiable llamara a este método se generaría una SecurityException [Excepción de Seguridad]. Sin embargo, si un código no fiable encapsulara este método fiable en un delegado y se lo pasara a un código totalmente fiable que invocase entonces al delegado, el método (java.io.File.delegate) tendría éxito. Por lo tanto, el ejemplo de realización expuesto aquí realiza una comprobación especial de seguridad al instanciar delegados, según se expone más adelante. Esta comprobación de seguridad se realiza en tiempo de ejecución.
El ejemplo de realización de la invención expuesto aquí extiende el modelo estándar de seguridad de Java a fin de asociar un conjunto de permisos de seguridad a cada clase de Java. Para una clase dada, el conjunto asociado de permisos de seguridad determina las operaciones fiables (tales como la Entrada / Salida de ficheros y la impresión) que los métodos de la clase están autorizados para realizar. Las clases no fiables tienen un conjunto de permisos vacío, mientras que las clases totalmente fiables tienen un conjunto de permisos completo (es decir, tienen todos los permisos).
Para que una instanciación de delegado tenga éxito en tiempo de ejecución, los permisos de C (la clase que contiene la expresión de instanciación del delegado) debe ser un superconjunto de los permisos poseídos por la clase que contiene el método m, según lo determinado en tiempo de ejecución. Si no es este el caso, se genera una IllegalAccessException [Excepción por Acceso Ilegal]. Además, esta comprobación de seguridad requiere que las clases derivadas de un delegado o de una clase multidelegada sean de categoría final, permitiendo que una búsqueda por la cadena de llamadas vea qué entidad está creando el delegado. Una consecuencia directa es que las clases no fiables sólo puedan crear delegados sobre métodos no fiables, mientras que las clases totalmente fiables (es decir, las clases del sistema) pueden crear delegados sobre todos los métodos accesibles.
Actividades de Compilador y de Intérprete
Según lo descrito anteriormente, el compilador 14 y el software intérprete 16 son componentes de software distintos. Sin embargo, estos componentes pueden, en algunos casos, realizar las mismas funciones, tales como enlazar delegados, según la modalidad de operación. Además, las funciones del compilador 14 y del software intérprete 16 pueden, en algunos casos, intercambiarse o compartirse entre sí. Por consiguiente, la invención no está limitada en modo alguno por la división particular de funciones expuesta en el ejemplo de realización descrito aquí. En cambio, el compilador 14 y el software intérprete 16 deberían concebirse compartiendo la tarea común de procesar código de ordenador basado en objetos, a fin de prepararlo para su ejecución en un ordenador.
La Clase com.ms.lang.Delegate
Según lo observado anteriormente, todos los delegados derivan de esta clase Delegate básica. Un objeto de tipo Delegado encapsula una entidad invocable: una instancia y un método de la instancia. Un ejemplo de definición 38 de la clase Delegate se muestra en la figura 6.
El constructor protected Delegate (Object destino, String NombreMetodo) inicializa un objeto Delegate recién creado, de manera tal que encapsule el destino y el método especificado por los argumentos. Si el destino es nulo, entonces se activa una NullPointerException [Excepción por Puntero Nulo]. El argumento NombreMetodo debe denotar un método que sea coincidente, accesible y adecuado, según lo definido precedentemente. Si no puede hallarse ningún método de destino coincidente, se genera una IllegalArgumentException [Excepción por Argumento Ilegal] en tiempo de ejecución. Si no se halla un método, se genera un NoSuchMethodError [Error de No Hay Tal Método].
El resultado de public final boolean equals (Object obj) es verdadero si y sólo si el argumento no es nulo, y es un objeto Delegate que tiene el mismo método de destino, y una lista de invocación como este objeto Delegate. Observe que dos delegados no necesitan ser del mismo tipo a fin de igualarse entre sí, según lo definido por Delegate.equals. Esta expresión prevalece sobre el método equals del Objeto (Véase \NAK 20.1.3 de la ELJ).
La expresión public static final Delegate combine (Delegate a, Delegate b) combina los dos delegados dados para formar un único delegado. Si tanto a como b son nulos, el resultado es nulo. Si sólo a o b es nulo, el resultado es el delegado no nulo. Si ni a ni b son nulos, el resultado es un nuevo delegado con una lista de invocación formada por la concatenación de las listas de invocación de a y b, en ese orden. No se considera un error que la lista de invocación contenga entradas duplicadas - entradas que se refieren al mismo método sobre el mismo objeto. Si ni a ni b son nulos, entonces los delegados a y b deben ser del mismo tipo efectivo. En caso contrario, una IllegalArgumentException [Excepción por Argumento Ilegal] es generada por el compilador 14. Si ni a ni b son nulos, entonces los delegados a y b deben ser de un tipo efectivo que derive de la clase DelegateMulticast. En caso contrario, una MulticastNotSupportedException [Excepción por Multiformes no Soportados] es generada por el compilador
14.
La expresión public static final Delegate combine (Delegate \talloblong delegados) envuelve un delegado con una lista de invocación que consiste en la concatenación de las listas de invocación de cada uno de los delegados en la formación de delegados, en su orden. Si la lista de invocación resultante es vacía, el resultado es nulo. La formación de delegados puede contener entradas nulas; tales entradas son ignoradas. Si el parámetro de la formación de delegados es nulo o vacío, el resultado es nulo. Los elementos no nulos de la formación de delegados deben ser del mismo tipo efectivo; en caso contrario, se genera una IllegalArgumentException [Excepción por Argumento Ilegal]. Si hay múltiples elementos no nulos en la formación de delegados, entonces estos elementos deben ser de un tipo efectivo que derive de la clase MulticastDelegate. En caso contrario, una MulticastNotSupportedException [Excepción por Multiformes no Soportados] es generada por el compilador 14.
La expresión public static final Delegate remove (Delegate origen, Delegate valor) devuelve un delegado con una lista de invocación formada al quitar la última aparición (en caso de haberla) del delegado dado por el parámetro valor de la lista de invocación del delegado dado por el parámetro origen. El delegado quitado de la lista de invocación es el último delegado para el cual es verdadera la siguiente expresión: valor.equals (delegado), donde delegado es el miembro en cuestión de la lista de invocación. Si el parámetro valor es nulo, o si el delegado dado por el parámetro valor no aparece en la lista de invocación del origen, el resultado es el parámetro origen. Si la lista de invocación resultante es vacía, el resultado es nulo. Si el parámetro origen es nulo, el resultado es nulo.
La expresión public final Object dynamicinvoke (Object \talloblong args) puede utilizarse para invocar el método en modalidad de enlace tardío (Delegate.dynamicInvoke). Cuando es llamado, el miembro dynamicInvoke causa la ejecución del método que el delegado encapsula, pasando los elementos del argumento args como argumentos para el método. El resultado de dynamicInvoke es el resultado de la invocación del método encapsulado. Si el resultado de la invocación del método es una referencia a objeto, entonces se devuelve esta referencia, En caso contrario, si el resultado es un valor primitivo, entonces el valor primitivo se envuelve en un Objeto y se devuelve. (P. ej., un valor booleano se envuelve en un objeto Booleano). En caso contrario, el tipo de devolución del método es vacío, y se devuelve un Objeto que contiene el valor nulo.
El método public final static Method getMethod() devuelve una referencia al único objeto Method que es el método del par (destino, método).
El método public final static Object getTarget() devuelve una referencia a la parte de instancia del dúo (instancia, método) que se necesita para encapsular una entidad invocable.
El método public Delegate \talloblong getInvocationList () devuelve la lista de invocación de este delegado, en el orden de invocación. Para delegados no multiformes, el resultado es siempre una formación con un único elemento. Para delegados multiformes, descritos más adelante, la formación resultante puede tener más de un elemento. Se garantiza que la lista de invocación de cada uno de los elementos en la formación devuelta tiene exactamente una entrada.
Delegados Multiformes
Todos los delegados multiformes derivan de la clase MulticastDelegate, mencionada en este ejemplo de realización de Java como la Clase com.ms.lang.MulticastDelegate. El efecto de invocar un delegado multiforme puede ser que se invoquen múltiples métodos. El conjunto de métodos invocados por el método de invocación de un delegado se denomina la lista de invocación del delegado, y puede obtenerse utilizando el método getInvocationList [obtenerListaInvocación].
Un delegado que hereda directamente de Delegate siempre tendrá una lista de invocación con un elemento - él mismo. Un delegado que hereda de la clase MulticastDelegate puede tener una lista de invocación con más de un elemento. Los métodos Delegate.combine y Delegate.remove se utilizan para crear nuevas listas de invocación.
Los métodos Invoke y dynamicInvoke multiplican su acción invocando a cada uno de los delegados en la lista de invocación con los argumentos transferidos. Los delegados se invocan sincrónicamente, en el orden en que aparecen en la lista de invocación. Si uno de los delegados devuelve una excepción, entonces cesa la invocación múltiple, y se propaga la excepción hasta el que ha llamado al método Invoke. Mientras transcurre un Invoke de acción múltiple, pueden ocurrir llamadas a Delegate.combine y Delegate.remove. Tales llamadas no afectan a la lista de invocación empleada por la invocación múltiple que ya está transcurriendo.
En el presente ejemplo de realización de la invención, la clase MulticastDelegate (40) se define como lo ilustra la Figura 7.
La expresión protected MulticastDelegate next es una referencia interna al próximo delegado en la cadena de invocación múltiple. A fin de que se preserve el orden correcto de invocación, debe invocarse el delegado "next" antes de invocar el método que este delegado encapsula.
El constructor protected MulticastDelegate (Object destino, String NombreMetodo) funciona como el constructor correspondiente definido en la clase Delegate básica.
Una realización alternativa de invocar un delegado multiforme es construir una formación de delegados a invocar, recorriendo la cadena "next" del delegado multiforme. Esta lista puede situarse en la pila del programa. El software intérprete 16 de la máquina virtual recorre entonces esta formación en orden inverso y llama al método de invocación de cada delegado, con los parámetros que se han pasado al método de invocación del delegado multiforme. La ventaja de esta técnica es que la pila del programa no necesita ser tan profunda, dado que a lo sumo sólo dos copias de los parámetros pasados al método de invocación del delegado multiforme están en la pila.
Ejemplo alternativo de realización
Envoltura de Miembros Estáticos
En un ejemplo alternativo de realización de la invención, el lenguaje J++ se extiende adicionalmente para envolver miembros estáticos en una clase. Con este fin, se proporciona un constructor "class" cuya forma está definida por la clase Delegate básica. Los argumentos para este constructor, una Clase y un nombre de método de tipo String [Cadena de caracteres], combinados con el tipo del delegado, especifican unívocamente un miembro estático de la clase indicada que coincide con la definición del delegado. El delegado recién construido encapsula este método estático. Este constructor adopta la forma:
protected Delegate (Class clase, String NombreMétodo)
Este constructor inicializa un objeto Delegate recién creado de manera tal que encapsule el método estático especificado por los argumentos. Si la clase es nula, entonces se activa una NullPointerException [Excepción por Puntero Nulo]. El argumento NombreMétodo debe denotar un método que sea coincidente, accesible y adecuado, según lo definido anteriormente. Si no puede hallarse ningún método de destino coincidente, se genera una IllegalArgumentException [Excepción por Argumento Ilegal] en tiempo de ejecución. Si no se halla tal método, se genera una IllegalArgumentException.
En la primera etapa en tiempo de compilación para los delegados que envuelven a miembros estáticos, debe determinarse la clase o interfaz a buscar. Si es un nombre calificado de la forma NombreTipo.Identificador, entonces el nombre del método es el Identificador y la clase a buscar es la nombrada por el NombreTipo. Si NombreTipo es el nombre de una interfaz, en lugar de una clase, entonces ocurre un error de tiempo de compilación, porque esta forma sólo puede designar a métodos estáticos, y las interfaces no tienen métodos estáticos. También es necesario determinar, como en el caso de la envoltura de miembros de instancias de una clase, si el método es adecuado. Si hay una declaración de método coincidente y accesible para una expresión de instanciación del delegado, se la llama declaración de tiempo de compilación para la expresión de instanciación del delegado.
También deben realizarse otras comprobaciones sobre la declaración de tiempo de compilación. Si el designador de método tiene un NombreMétodo de la forma Identificador, y el designador de método aparece dentro de un método estático, o un inicializador estático, o en el inicializador para una variable estática, entonces tiene lugar un error de tiempo de compilación. En otros aspectos, la envoltura de miembros estáticos es una extensión o modificación de la envoltura de miembros de instancias, según lo descrito anteriormente.
Según esta realización alternativa, también se proporciona un constructor correspondiente para la clase MulticastDelegate: protected MulticastDelegate (Class clase, String NombreMétodo). Este constructor funciona como el constructor correspondiente definido en la clase Delegate básica.
Interfaz Invocable Alternativa
El Visual J++ de Microsoft® no brinda soporte a la herencia múltiple. Sin embargo, a veces será necesaria tal interfaz para convertir código fuente existente en un estilo de tipo delegado. Esta situación puede extenderse análogamente a java.lang.Thread frente a java.lang.Runnable. Para abordar este problema, un ejemplo de realización de la invención extiende el Visual J++ de Microsoft® para incluir una interfaz com.ms.lang.Callable 42, según se muestra en la Figura 8. Preferiblemente, los delegados implementan esta interfaz.
Modelo de Sucesos Basado en Delegados
En la programación orientada a objetos, un suceso es una construcción que permite que una fuente de sucesos notifique anónimamente a un perceptor de sucesos (o conjunto de perceptores de sucesos) que ha ocurrido una transición de estado de cierta clase. Los sucesos se emplean, típicamente, en un sistema más grande llamado un "modelo de componentes", que describe cómo un componente expone su código de funcionalidad, que está utilizando el componente. En un nivel fundamental, la mayoría de los modelos modernos de componentes describen cómo un componente expone sus propiedades (que describen el estado del componente), métodos (que exponen acciones que el componente es capaz de realizar) y sucesos (notificaciones del componente de que algo interesante ha ocurrido).
Una invocación de suceso es como una llamada de método a la inversa. Para una llamada de método, un consumidor de componentes llama a un método del componente, pasándole un cierto número de argumentos. Para un suceso, la llamada es en la dirección opuesta - el componente llama a un método proporcionado por el consumidor de componentes, pasándole un cierto número de argumentos. Además de la diferencia en la dirección de la llamada, hay varias otras diferencias notables.
Para una llamada de método, el consumidor, típicamente, tiene una dependencia explícita del componente que está siendo llamado. En cambio, las invocaciones de sucesos son típicamente anónimas - el componente no tiene una dependencia explícita del consumidor de componentes. En lugar de ello, los perceptores pueden conectarse con un suceso o conjunto de sucesos utilizando un mecanismo proporcionado por la fuente de los sucesos.
Para una llamada de método, además, el llamado determina la forma del método - el número y tipos de argumentos, y el tipo de retorno. Para una indicación de suceso, el origen del suceso (el llamador) determina la forma.
En el ejemplo de realización del modelo de componentes basado en delegados según la presente invención, descrito más adelante, los sucesos se utilizan, típicamente, para la comunicación entre un componente (a menudo escrito por un proveedor comercial) y el código de gestión de sucesos (escrito por un desarrollador que utiliza el componente). El ejemplo de realización del modelo de componentes descrito más adelante brinda soporte tanto a los sucesos uniformes como a los multiformes.
Clase e Interfaz
Se describe más adelante cómo exponer y explotar sucesos según este ejemplo de realización de la invención. Se definen y exponen aquí varias clases:
1)
La clase Event (Suceso). Los sucesos envuelven un estado interesante en un objeto de tipo suceso. Todos los tales objetos de tipo suceso derivan de la clase Event. La clase Event también se utiliza directamente para sucesos sin parámetros.
2)
El delegado EventHandler [Gestor de Sucesos], que se utiliza en conjunción con la clase Event.
3)
La clase CancelEvent [CancelarSuceso], que se utiliza para acciones que pueden cancelarse. Antes de que ocurra la acción, la fuente de sucesos notifica a los perceptores interesados que la acción está por ocurrir. Cada perceptor tiene la oportunidad de "cancelar" la acción.
4)
El delegado CancelEventHandler [GestorCancelarSucesos], que se utiliza en conjunción con la clase CancelEvent [CancelarSuceso].
Cómo Activar Sucesos
Para activar sucesos, una fuente de sucesos realiza una o más de las siguientes acciones:
1)
define una clase de sucesos;
2)
define un delegado "gestor de sucesos";
3)
proporciona métodos para "añadir" y "quitar", a fin de permitir que una fuente de sucesos se conecte con un suceso y posteriormente se desconecte de él; o bien
4)
proporciona un método para "activar sucesos" que activa un suceso.
Cómo Definir una Clase de Sucesos
Esta es una clase que deriva de la clase Event [Suceso] y, potencialmente, añade información contextual adicional. A menudo no es necesario definir una nueva clase de suceso, porque puede emplearse una clase de sucesos existente.
Las clases de sucesos se utilizan por convención. Es posible definir y utilizar sucesos que no emplean clases de sucesos en absoluto. El presente ejemplo de modelo de componentes recomienda empaquetar sucesos como objetos, a fin de facilitar los escenarios de despacho de sucesos y la generación de versiones. Estos temas se exponen adicionalmente aquí más adelante. Para los sucesos de ratón activados por una clase de ventanas, podría definirse la clase de sucesos mostrada en la Figura 9.
Cómo definir un delegado "gestor de sucesos"
Un tal delegado se necesita para cada conjunto interesante de sucesos. Tal delegado puede ser utilizado por múltiples sucesos. Por convención, se definen delegados gestores de sucesos que coincidan con el patrón:
public multicast delegate void <Nombre>Handler (Object origen, <TipoSuceso> e);
Para el ejemplo del suceso de ratón 44 de la Figura 9, esto implica:
public multicast delegate void MouseEventHandler (Object origen, MouseEvent e);
El ejemplo de realización del modelo de gestión de sucesos expuesto aquí proporciona métodos para "añadir" y "quitar", que permiten que una fuente de sucesos se conecte con el suceso, y posteriormente se desconecte de él. Por convención, se definen delegados gestores de sucesos que coincidan con el patrón:
public void addOn<NombreSuceso>Handler (<TipoGestorSucesos> gestor);
public void removeOn<NombreSuceso>Handler (<TipoGestorSucesos> gestor);
Para el ejemplo de sucesos de ratón, esto implica:
public void addOnMouseMoveHandler(MouseEventHandler gestor);
public void removeOnMouseMoveHandler(MouseEventHandler gestor);
Cómo proporcionar un método "activador de sucesos" que activa el suceso
Este método permite que las clases derivadas activen el suceso, cancelen el suceso que ha sido activado en una clase básica, y proporcionen el procesamiento previo y procesamiento posterior sin interferencia de los consumidores de componentes. El cuerpo del método activa el suceso llamando al Delegate.invoke para la propiedad adecuada, con valor de delegado, pasando los argumentos y añadiendo "this" como el valor del parámetro de origen para el suceso. Para las clases de categoría final, no hay necesidad de proporcionar tal método, ya que no es posible que existan clases derivadas. Por convención, se definen delegados gestores de sucesos que coincidan con el patrón:
protected void on<NombreSuceso> (<TipoSuceso> e);
Para el ejemplo de suceso de ratón, se hace referencia al método 46 ilustrado en la Figura 10.
Cómo Gestionar Sucesos
Para percibir sucesos, un perceptor de sucesos hace lo siguiente:
1)
Aprende qué sucesos están disponibles para un componente, utilizando la clase ComponentManager [AdministradorComponentes], que se describe en la ELJ.
2)
Crea una función gestora de sucesos con la signatura correcta, según lo definido por el delegado utilizado para la correspondiente propiedad de suceso, por ejemplo, según se muestra en el código fuente 48 de la Figura 11.
3)
Conecta el código de gestión de sucesos con el suceso, llamando al método "add" ["añadir"] proporcionado por la fuente de sucesos, por ejemplo, según se muestra en el código fuente 50 de la Figura 12.
4)
Optativamente, desconecta el código gestor de sucesos del suceso, llamando al método "remove" ("quitar") proporcionado por la fuente; por ejemplo, según se muestra en el código fuente 52 de la Figura 13. En la mayoría de los casos, no hay necesidad de desconectarse explícitamente.
Primer Ejemplo del Modelo de Sucesos en Código J++ - El ejemplo Box (Cuadro)
Las Figuras 14A-14B ilustran el ejemplo de código J++ 54, que muestra la aplicación del modelo de delegados y sucesos descrito anteriormente. En las Figuras 14A-14B, se declara una clase de sucesos de ratón y un delegado gestor de sucesos de ratón. También se expone una declaración de clase box (cuadro), así como una ilustración de un consumidor de componentes que utiliza dos instancias de cuadro.
Otro Ejemplo de un Modelo de Sucesos en Código J++ - el Ejemplo Smiley (Emoticón)
Un ejemplo sencillo de suceso en el cual se activa un suceso sin ningún parámetro, según se ilustra en las Figuras 15A-15B. En el programa de J++ 56 de las Figuras 15A-15B, el control Smiley [Emoticón] activa un suceso cuando su propiedad "feliz" cambia.
Sucesos Uniformes y Sucesos Multiformes
El modelo de sucesos descrito anteriormente funciona igualmente bien para escenarios uniformes y multiformes. Por convención preferida en el ejemplo de realización expuesto aquí, todos los sucesos son multiformes. La definición de un suceso uniforme es bastante fácil de realizar, sin embargo - sólo omitir el modificador Multicast [multiforme] en la declaración del delegado. Los sucesos pueden aparecer tanto en las definiciones de clase como en las interfaces. Es posible definir un conjunto de sucesos en una interfaz, y hacer que múltiples clases brinden soporte a esta interfaz.
La diferencia principal entre un modelo de sucesos multiforme y un modelo de sucesos uniformes está en cómo se realiza la conexión. Con los multiformes, es necesario utilizar un delegado multiforme y emplear los métodos "addOn" ["añadirCuando"] y "removeOn" ["quitarCuando"]. Para los uniformes, es posible emplear un delegado no multiforme y permitir que la conexión / desconexión con un suceso se realice con asignaciones (set) y obtenciones (get) de propiedades. Es decir, un componente proporciona una propiedad con valor de delegado para cada uno de los sucesos que expone. Por ejemplo, para un suceso MouseMove (MoverRatón) un componente, para exponer un suceso "pepe", expondría una propiedad "OnPepe", como se ilustra en el código fuente 58 mostrado en la figura
16.
La Clase Suceso
La clase Event (Suceso) cumple diversos fines:
1) Actúa como la clase básica para todos los sucesos. Por convención, los sucesos para los componentes emplean un único parámetro, cuyo tipo es una clase que deriva de la clase Event.
2) Se utiliza para sucesos que no tienen ningún estado. El miembro estático EMPTY se utiliza usualmente con este fin, y permite que un suceso se active eficientemente, según lo ejemplificado en el código fuente 60 ilustrado en la Figura 17.
El delegado EventHandler (GestorSucesos)
El delegado EventHandler se utiliza para sucesos que toman un único parámetro de tipo Event, según se ilustra en el código fuente 62 de la Figura 18.
La clase CancelEvent (CancelarSuceso)
La clase CancelEvent se utiliza para sucesos que se refieren a una acción que puede cancelarse. La clase CancelEvent proporciona un campo booleano, llamado "cancel", que dice si la acción en cuestión ha sido cancelada. Un valor de verdad indica que la acción ha sido cancelada; un valor de falsedad indica que la acción no ha sido cancelada. Puede proporcionarse un valor inicial para "cancel", utilizando el constructor proporcionado. Típicamente, "cancel" se inicializa con el valor de falsedad, de manera tal que si el suceso no es gestionado, o si el gestor de sucesos no altera el campo "cancel", la fuente del suceso supone que el permiso para realizar la acción ha sido concedido. La clase CancelEvent se ilustra en el código fuente 64 de la Figura 19.
El delegado CancelEventHandler (GestorCancelarSuceso)
El delegado CancelEventHandler se utiliza para sucesos que toman un único parámetro del tipo CancelEvent, según se ilustra en el código 66 de la Figura 20.
Otros Usos de los Delegados
Como se ha demostrado anteriormente, los delegados son útiles en general, en particular, para entornos relacionados con sucesos. Sin embargo, también son útiles para entornos no orientados a sucesos, tales como un sustituto para el mecanismo de retrollamada en J/Direct y para la invocación débil.
Aplicación de la Invención a Otros Lenguajes de Programación y Realizaciones de Sistemas / Alternativas
El ejemplo de realización de los modelos de delegados y sucesos de la presente invención, descrito aquí, se expresa como una extensión del Visual J++ de Microsoft®. Sin embargo, se entenderá que las invenciones expuestas aquí son ampliamente aplicables a otros sistemas de lenguajes de programación orientada a objetos, tales como C++, y a lenguajes de programación basados en objetos, tales como Visual Basic de Microsoft®, o a otras versiones de J++ disponibles en la Corporación Microsoft o en otros desarrolladores.
Además, las invenciones expuestas aquí son aplicables a, y toman la forma de, tanto programas de ordenador escritos utilizando el código fuente de la presente invención, como compiladores y máquinas virtuales de tiempo de ejecución, y otros sistemas de programación que traducen programas de ordenador en comandos ejecutables por un sistema informático.
La invención proporciona además la realización de modelos de delegados y sucesos en forma de código de un ordenador físico, o de un portador, tal como, pero no limitado a, un controlador de disco rígido, un disquete, memoria de ordenador o señales electrónicas que puedan utilizarse para transportar tal código desde un ordenador o medio de almacenamiento a otro.
Además, aunque las realizaciones reveladas aquí se implementan en software, las invenciones expuestas aquí no están en modo alguno limitadas exclusivamente a la implementación en software, y contemplan expresamente la implementación en firmware y en lógica cableada basada en silicón, o de otras formas, o combinaciones de lógica cableada, firmware y software, o cualesquiera sustitutos adecuados de los mismos.
Conclusión
De esta manera, se ha descrito en lo anterior un método y dispositivo para encapsular una referencia a un método en sistemas de programación orientados a objetos o basados en objetos, y para garantizar que la referencia es segura. Como se ha expuesto en lo anterior, la invención provee:
a)
definir una entidad que define la forma del método al cual referirse;
b)
obtener una referencia a un método;
c)
almacenar esta referencia en estructuras de datos arbitrarias;
d)
pasar la referencia a código escrito por terceros;
e)
permitir la invocación del método por parte de cualquiera que tenga la referencia al método; y
f)
permitir al tenedor de una referencia a un método determinar el objeto y método de destino a los cuales se hace referencia.
Además, el sistema de programación de la presente invención logra los objetivos precedentes de una manera caracterizada por tipos fuertes, haciendo posible que:
a)
los desarrolladores conozcan pronto los problemas de la falta de coincidencia de tipos (en tiempo de compilación) y no tarde (en tiempo de ejecución); y
b)
las herramientas de desarrollo presenten información a los desarrolladores acerca de la forma de los componentes que utilizan delegados.
Además, la invención provee programación basada en sucesos, en donde el código relacionado con sucesos puede encapsularse en delegados.

Claims (19)

1. Un producto de programa de ordenador basado en objetos, que comprende un código de programa de ordenador, realizado en una forma legible por ordenador, sobre un portador físico (22; 24; 26; 28), en el cual el código fuente del programa causa que un ordenador (20) lleve a cabo las etapas de representar una instancia y un primer método de una clase por medio de un valor delegado, que puede asignarse a variables y transferirse desde un procedimiento a otro, y de invocar al primer método llamando a un segundo método de una instancia de una clase, utilizando el valor delegado, en el cual los parámetros proporcionados al segundo método se proporcionan al primer método, y la lista de parámetros del segundo método coincide con la lista de parámetros del primer método; y en el cual, además, el primer método es identificado por nombre y por la coincidencia de la lista de parámetros y del tipo del resultado del primer método con la lista de parámetros y el tipo de resultado declarado para la clase.
2. Un producto de programa de ordenador según la reivindicación 1, en el cual, además, la instancia de la clase está representada por un valor que puede asignarse a variables y pasarse desde un procedimiento a otro.
3. Un producto de programa de ordenador según la reivindicación 2, en el cual, además, el código del programa causa que el ordenador (20) invoque al segundo método sobre una variable a la que ha sido asignado un valor que representa una instancia de la clase.
4. Un producto de programa de ordenador según la reivindicación 1, en el cual, además, los sucesos se gestionan utilizando el primer método.
5. Un producto de programa de ordenador según la reivindicación 1, en el cual, además, el ordenador (20) invoca uno o más primeros métodos adicionales con la llamada al segundo método, y en el cual se proporciona al segundo método uno o más conjuntos de parámetros correspondientes adicionales, para que sean proporcionados respectivamente al primer método, o a los primeros métodos adicionales.
6. Un producto de programa de ordenador según la reivindicación 5, en el cual, además, hay creada una lista de invocación asociada con el segundo método, en el cual la lista de invocación especifica el primer método a invocar.
7. Un producto de programa de ordenador según la reivindicación 6, en el cual, además, se añaden y se borran los primeros métodos de la lista de invocación.
8. Un sistema de programación basado en objetos que comprende un ordenador (20) adaptado para representar una instancia y un primer método de una clase por un valor de delegado, que puede asignarse a variables y pasarse desde un procedimiento a otro; y para invocar un primer método, con una llamada a un segundo método de una instancia de una clase utilizando el valor de delegado, en el cual los parámetros proporcionados al segundo método son proporcionados al primer método, y la lista de parámetros del segundo método coincide con la lista de parámetros del primer método, y en el cual, además, el primer método se identifica por nombre y por la coincidencia de la lista de parámetros y del tipo de resultado del primer método con la lista de parámetros y el tipo de resultado declarado para la clase.
9. Un sistema de programación según la reivindicación 8, en el cual, además, la instancia de la clase está representada por un valor que puede asignarse a variables y pasarse desde un procedimiento a otro.
10. Un sistema de programación según la reivindicación 9, en el cual, además, el código del programa causa que el ordenador (20) invoque al segundo método sobre una variable a la que se ha asignado un valor que representa una instancia de la clase.
11. Un sistema de programación según la reivindicación 8, en el cual, además, los sucesos se gestionan utilizando el primer método.
12. Un sistema de programación según la reivindicación 8, en el cual, además, el ordenador invoca a uno o más primeros métodos adicionales con la llamada al segundo método, en donde uno o más conjuntos de parámetros adicionales correspondientes se proporcionan al segundo método, para ser respectivamente proporcionados al primer método, o a los primeros métodos adicionales.
13. Un sistema de programación según la reivindicación 12, en el cual, además, hay creada una lista de invocación, asociada con el segundo método, en donde la lista de invocación especifica los primeros métodos a invocar.
14. Un sistema de programación según la reivindicación 13, en el cual, además, los primeros métodos se añaden y se borran de la lista de invocación.
15. Un sistema de programación según la reivindicación 8, en el cual, además, el ordenador está adaptado con software.
16. Un sistema de programación según la reivindicación 8, en el cual, además, el ordenador está adaptado con hardware y software.
17. Un sistema de programación según la reivindicación 8, en el cual, además, el sistema de programación incluye un compilador (14).
18. Un sistema de programación según la reivindicación 8, en el cual, además, el sistema de programación incluye un intérprete (16).
19. Un método para programar un ordenador (20) en código de ordenador basado en objetos, que comprende el empleo de un ordenador (20) para realizar las etapas de programación de:
a)
definir una primera clase que tiene un primer método para ser utilizado a fin de hacer referencia a un segundo método de una segunda clase;
b)
representar una instancia de la primera clase con un valor de delegado, en donde una instancia de la segunda clase y el segundo método están identificados como parámetros de la instancia de la primera clase; e
c)
invocar el segundo método llamando al primer método sobre la instancia de la primera clase, empleando el valor para hacer referencia a la instancia.
ES99955342T 1998-06-03 1999-06-03 Referencia de un procedimiento en un programa basado en objetos. Expired - Lifetime ES2230900T3 (es)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US09/089,619 US6381734B1 (en) 1998-06-03 1998-06-03 Method, software and apparatus for referencing a method in object-based programming
US89619 1998-06-03

Publications (1)

Publication Number Publication Date
ES2230900T3 true ES2230900T3 (es) 2005-05-01

Family

ID=22218650

Family Applications (1)

Application Number Title Priority Date Filing Date
ES99955342T Expired - Lifetime ES2230900T3 (es) 1998-06-03 1999-06-03 Referencia de un procedimiento en un programa basado en objetos.

Country Status (7)

Country Link
US (1) US6381734B1 (es)
EP (1) EP1082654B1 (es)
JP (1) JP4220127B2 (es)
AT (1) ATE280973T1 (es)
DE (1) DE69921474T2 (es)
ES (1) ES2230900T3 (es)
WO (1) WO1999063433A1 (es)

Families Citing this family (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6918126B1 (en) * 2000-09-08 2005-07-12 International Business Machines Corporation Method and apparatus for creating and enforcing protected system level Java code
US7150001B1 (en) * 2001-03-19 2006-12-12 Microsoft Corporation System and method to facilitate design-time component discovery
US6934946B2 (en) * 2001-05-15 2005-08-23 Sun Microsystems, Inc. Lightweight native method invocation interface for java computing environments
US7152223B1 (en) * 2001-06-04 2006-12-19 Microsoft Corporation Methods and systems for compiling and interpreting one or more associations between declarations and implementations in a language neutral fashion
US7636720B2 (en) * 2003-05-08 2009-12-22 Microsoft Corporation Associating and using information in a metadirectory
US7634480B2 (en) 2003-05-08 2009-12-15 Microsoft Corporation Declarative rules for metadirectory
US7257603B2 (en) * 2003-05-08 2007-08-14 Microsoft Corporation Preview mode
US7516157B2 (en) * 2003-05-08 2009-04-07 Microsoft Corporation Relational directory
US20040225632A1 (en) * 2003-05-08 2004-11-11 Microsoft Corporation Automated information management and related methods
US7330853B2 (en) 2003-05-08 2008-02-12 Microsoft Corporation Attribute value selection for entity objects
US7620658B2 (en) * 2003-09-24 2009-11-17 Microsoft Corporation Configuration of a directory system
US7552450B1 (en) 2003-09-30 2009-06-23 Microsoft Corporation Systems and methods for enabling applications via an application programming interface (API) to interface with and configure digital media components
US8533597B2 (en) * 2003-09-30 2013-09-10 Microsoft Corporation Strategies for configuring media processing functionality using a hierarchical ordering of control parameters
US20070016292A1 (en) * 2003-11-14 2007-01-18 Edward Perez Epithelium treatment methods and devices for treating the epithelium
US20050246773A1 (en) * 2004-04-29 2005-11-03 Microsoft Corporation System and methods for processing partial trust applications
US7665062B1 (en) 2004-07-02 2010-02-16 Borland Software Corporation System and methodology for design-time dynamic class type construction
US7561673B2 (en) * 2004-09-30 2009-07-14 Microsoft Corporation Integration of speech services with telecommunications
US20070074185A1 (en) * 2005-08-30 2007-03-29 Microsoft Corporation Identifier expressions
US7694285B2 (en) * 2005-08-30 2010-04-06 Microsoft Corporation Relaxed and extended delegates
US9009688B2 (en) * 2005-12-30 2015-04-14 Intel Corporation Type checking for object-oriented programming languages
US7752596B2 (en) * 2006-03-17 2010-07-06 Microsoft Corporation Connecting alternative development environment to interpretive runtime engine
US7743087B1 (en) 2006-03-22 2010-06-22 The Math Works, Inc. Partitioning distributed arrays according to criterion and functions applied to the distributed arrays
JP5359891B2 (ja) * 2008-02-19 2013-12-04 日本電気株式会社 情報表示装置、方法及びプログラム
US8234626B2 (en) 2008-06-04 2012-07-31 Dell Products L.P. Modular ASL component
US9569282B2 (en) * 2009-04-24 2017-02-14 Microsoft Technology Licensing, Llc Concurrent mutation of isolated object graphs
US20110055809A1 (en) * 2009-08-28 2011-03-03 International Business Machines Corporation Typed configuration management in programming languages
US20120159429A1 (en) * 2010-12-15 2012-06-21 Microsoft Corporation Metadata based eventing
US8793706B2 (en) 2010-12-16 2014-07-29 Microsoft Corporation Metadata-based eventing supporting operations on data
US20130212598A1 (en) * 2012-02-14 2013-08-15 Microsoft Corporation Dependency informer
US9626171B2 (en) 2015-07-24 2017-04-18 Oracle International Corporation Composing a module system and a non-module system
US10104090B2 (en) 2015-08-25 2018-10-16 Oracle International Corporation Restrictive access control for modular reflection
US10394528B2 (en) 2016-03-30 2019-08-27 Oracle International Corporation Returning a runtime type loaded from an archive in a module system
US10360008B2 (en) * 2016-09-16 2019-07-23 Oracle International Corporation Metadata application constraints within a module system based on modular encapsulation

Family Cites Families (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
AU639802B2 (en) * 1990-08-14 1993-08-05 Oracle International Corporation Methods and apparatus for providing dynamic invocation of applications in a distributed heterogeneous environment
AU628264B2 (en) * 1990-08-14 1992-09-10 Oracle International Corporation Methods and apparatus for providing a client interface to an object-oriented invocation of an application
US5265206A (en) * 1990-10-23 1993-11-23 International Business Machines Corporation System and method for implementing a messenger and object manager in an object oriented programming environment
US5421016A (en) * 1991-12-12 1995-05-30 International Business Machines Corporation System and method for dynamically invoking object methods from an application designed for static method invocation
US5515536A (en) * 1992-11-13 1996-05-07 Microsoft Corporation Method and system for invoking methods of an object through a dispatching interface
US5632034A (en) * 1993-06-01 1997-05-20 International Business Machines Corporation Controlling method invocation sequence through virtual functions in an object-oriented class library
DE69426143T2 (de) * 1993-09-10 2001-06-13 Sun Microsystems, Inc. Kundenseitiger Stubinterpretor
US5732271A (en) * 1995-01-23 1998-03-24 International Business Machines Corporation Data processing system and method for processing an object oriented development environment employing property inheritance using prototypical objects
US5680619A (en) * 1995-04-03 1997-10-21 Mfactory, Inc. Hierarchical encapsulation of instantiated objects in a multimedia authoring system
DE19535519C2 (de) * 1995-09-25 1999-03-04 Ibm Verfahren zur Reduzierung des Umfanges von Computerprogrammen
US5864862A (en) * 1996-09-30 1999-01-26 Telefonaktiebolaget Lm Ericsson (Publ) System and method for creating reusable components in an object-oriented programming environment
US6298476B1 (en) * 1995-12-04 2001-10-02 International Business Machines Corporation Object oriented software build framework mechanism
US5768505A (en) * 1995-12-19 1998-06-16 International Business Machines Corporation Object oriented mail server framework mechanism
US6104874A (en) * 1996-10-15 2000-08-15 International Business Machines Corporation Object oriented framework mechanism for order processing including pre-defined extensible classes for defining an order processing environment
US6002867A (en) * 1996-10-24 1999-12-14 Inprise Corporation Development system with methods providing visual form inheritance
US5937189A (en) * 1996-11-12 1999-08-10 International Business Machines Corporation Object oriented framework mechanism for determining configuration relations
US5991802A (en) * 1996-11-27 1999-11-23 Microsoft Corporation Method and system for invoking methods of objects over the internet
US5920720A (en) * 1997-02-25 1999-07-06 Microsoft Corporation Efficient computer based virtual machine object structure
US6182274B1 (en) * 1997-05-01 2001-01-30 International Business Machines Corporation Reusing code in object-oriented program development
US5941945A (en) * 1997-06-18 1999-08-24 International Business Machines Corporation Interest-based collaborative framework
US6014710A (en) * 1997-06-30 2000-01-11 Sun Microsystems, Inc. System and method for message transmission between network nodes using remote wires
US6078743A (en) * 1997-11-24 2000-06-20 International Business Machines Corporation Generic IDE interface support for scripting
US6199197B1 (en) * 1998-03-11 2001-03-06 International Business Machines Corporation Apparatus and method for providing common behavior across different processing levels in an object oriented framework
US6195791B1 (en) * 1998-03-11 2001-02-27 International Business Machines Corporation Object mechanism and method for coupling together processes to define a desired processing environment in an object oriented framework
US6275979B1 (en) * 1998-03-11 2001-08-14 International Business Machines Corporation Implementation for an object oriented run-time extensible item
US6083276A (en) * 1998-06-11 2000-07-04 Corel, Inc. Creating and configuring component-based applications using a text-based descriptive attribute grammar

Also Published As

Publication number Publication date
DE69921474D1 (de) 2004-12-02
DE69921474T2 (de) 2006-01-05
EP1082654B1 (en) 2004-10-27
EP1082654A1 (en) 2001-03-14
WO1999063433A1 (en) 1999-12-09
JP4220127B2 (ja) 2009-02-04
US6381734B1 (en) 2002-04-30
ATE280973T1 (de) 2004-11-15
JP2002517815A (ja) 2002-06-18

Similar Documents

Publication Publication Date Title
ES2230900T3 (es) Referencia de un procedimiento en un programa basado en objetos.
Johnsen et al. ABS: A core language for abstract behavioral specification
EP3170073B1 (en) Variable handles
Noble et al. Flexible alias protection
Johnsen et al. Creol: A type-safe object-oriented model for distributed concurrent systems
EP0546683B1 (en) Language neutral objects
EP0735474B1 (en) Method and apparatus for generation and installation of distributed objects on a distributed object system
Saraswat Java is not type-safe
EP0546684A2 (en) Method stubs for redispatch
JP2005530238A (ja) 動的モデル/コード結合を提供するシステム、方法、および媒体
VanHattum et al. Verifying dynamic trait objects in Rust
Eugster Uniform proxies for Java
Börger et al. Modular design for the Java virtual machine architecture
Greenhouse A programmer-oriented approach to safe concurrency
Eisenbach et al. Changing Java Programs
Mohanty et al. Basic solidity programming
Johnsen et al. A dynamic binding strategy for multiple inheritance and asynchronously communicating objects
Chisnall A Modern Objective-C Runtime.
Lewis Producing network applications using object-oriented petri nets
Savinov Concept-oriented programming: from classes to concepts and from inheritance to inclusion
Anderson et al. Implementing Fickle
Buckley Ownership types restrict aliasing
Zimmerman et al. Latte: Lightweight Aliasing Tracking for Java
Rintala Techniques for Implementing Concurrent Exceptions in C++
Tardieu et al. Shim: A deterministic approach to programming with threads