AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Este contenido se ha traducido automáticamente.  Haga clic aquí  para ver la versión en inglés.
Ayuda / WLanguage / POO (Programación Orientada a Objetos)
  • Resumen de una clase
  • Ejemplo de clase
  • Creación y declaración de una clase
  • Creación de una clase
  • Sintaxis para declarar la clase y sus elementos
  • Sintaxis detallada de la declaración de clase
  • Ejemplo
  • Declarar a los miembros de una clase
  • Sintaxis
  • Sintaxis detallada
  • Declarando a los miembros de Array
  • Serialización de los miembros de una clase
  • La vinculación de los datos
  • Generación de los métodos para acceder a un miembro de la clase (guardado para compatibilidad con versiones anteriores)
  • Declaración de las constantes de clase
  • Sintaxis
  • Sintaxis detallada
  • Ejemplo
  • Declarando un singleton
  • Creación y declaración de los métodos de clase
  • Creación de un método de clase
  • Sintaxis para declarar un método
  • Sintaxis detallada
  • Alcance identificado por la Color de la barra
  • Borrar un método
  • Creación y declaración de propiedades
  • Presentación
  • Creando una clase Property
  • La vinculación de los datos
  • Derechos de acceso a una Property
  • Miembros y propiedades
  • Herencia
  • Pasando propiedades como parámetros a una función de WLanguage o Procedure
  • Instancias de clase con contexto HFSQL independiente
  • Presentación
  • Sintaxis
  • aprovechamiento
  • Notas
  • Leyenda de los iconos utilizados
  • Nuevas características desde la versión 9
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Resumen de una clase
Una clase está hecha de:
  • datos, llamados miembros.
  • constantes.
  • procedimientos, llamados métodos.. Un método es una Procedure escrita específicamente para manipular los objetos encontrados en la clase.
  • propiedades. Una propiedad es un elemento de clase que puede ser utilizado directamente por su nombre como miembro y para el cual las operaciones de asignación de valor y recuperación desencadenan la ejecución de una Process.
    Universal Windows 10 App Las propiedades de clase no están disponibles.
Para utilizar una clase, debe declarar uno o varios objetos. Todos los objetos de una clase dada tienen los mismos atributos y comportamiento, pero sus miembros contienen datos diferentes.
Por defecto, los miembros de una clase son públicos. Se puede acceder a ellos por un método de la clase así como por un proceso/Event del proyecto o sus elementos (control, ventana, etc.).
Ejemplo de clase
La clase "CFile" incluye a los miembros: m_sShortPath, m_sLongPath, m_sExtension, m_sShortName, m_sLongName.
La clase "CFile" incluye los siguientes métodos:
  • FileDate()
  • FileSelection()
  • FileTime()
  • FileSize()
Esta clase no tiene Property.
La siguiente información se muestra en el panel "Explorador de proyectos":
Explorador de proyectos, carpeta
Vea las notas para obtener la description de los diferentes iconos utilizados.
Creación y declaración de una clase

Creación de una clase

Para crear una clase:
  1. Visualizar el panel "Explorador de proyectos" si es necesario: en la pestaña "Inicio", en el grupo "Entorno", despliegue "Paneles" y seleccione "Explorador de proyectos".
  2. En el panel "Explorador de proyectos", abra el menú contextual de la carpeta "Clases" y seleccione "Crear una clase".
  3. En la ventana que se visualiza, introduzca el nombre de la clase y valide.
  4. El editor de código muestra el código de la nueva clase. La "Declaración" Event de la clase así como el constructor y el destructor se crean automáticamente.

Sintaxis para declarar la clase y sus elementos

<ClassName> is Class [, abstract]
<Scope and rights>
<Declaration member 1>
<Declaration member 2>
<Scope and rights>
<Declaration member 3>
<Declaration member 4>
...
<CONSTANT>
<Declaration of constants>
END

Sintaxis detallada de la declaración de clase

<ClassName>
Nombre que identifica a la clase.
abstract: opcional
Se utiliza para especificar que la clase es abstract. Una clase abstract es una clase base que agrupa comportamientos comunes a varias clases.
Una clase es abstract cuando se declara como tal o si uno de sus métodos es abstract.
Una clase abstract no puede ser instanciada.
<Alcance y derechos>
Este parámetro tiene el siguiente formato: [ GLOBAL][ Público / Público CONSTANTE / Protegido / Protegido CONSTANTE / Privado ]
GLOBAL: Opcional
Define un miembro global. Este miembro existirá fuera de los objetos. Se puede utilizar sin instanciar un objeto. Si se declaran varios objetos, un miembro global es común a todos los objetos.
<Modo de acceso>: Opcional
Permite restringir el acceso a este miembro de la clase.
  • Public (por Default): acceso permitido desde cualquier código de la clase o proyecto.
  • Público CONSTANTE: El valor del miembro puede ser leído y modificado desde un código de la clase o desde un código de una clase derivada; sólo puede ser leído desde otro código de la aplicación..
  • Protegido : acceso permitido desde un código de la clase o desde un código de una clase derivada (y una clase "heredada")
  • Protegido CONSTANTE: El valor del miembro puede ser leído y modificado a partir de un código de la clase; sólo puede ser leído a partir de un código de una clase derivada; no puede ser accedido a partir de ningún otro código de la aplicación..
  • Privado : acceso permitido desde un código de la clase
<Miembro de la declaración>
Sintaxis para declarar a los miembros de la clase (véase más abajo). El alcance y los derechos de acceso de los miembros son los actuales.
<Declaración de constantes>
Sintaxis para declarar las constantes (ver abajo).

Ejemplo

SystemClass is Class
Name is string
END
Declarar a los miembros de una clase

Sintaxis

<Member name> is <Member type> [ = <Initial value>]

Sintaxis detallada

<Nombre del miembro>
Nombre que identifica al miembro.
<Tipo de miembro>
Tipo de miembro elegido entre los tipos disponibles de WLanguage.
<Valor inicial>
Valor inicial del miembro.
SystemClass is Class
Name is string
PRIVATE
ClassSize is int
END

Declarando a los miembros de Array

Para declarar una array en una clase, utilice la siguiente sintaxis:
SystemClass is Class
DefaultArray is array of 1 int
END
La array se declara de la misma manera que la arrays simple (para más detalles, véase Tipo «array»).
Cuando se copian instancias de clases, todos los miembros de la clase se copian en la nueva instancia excepto arrays. Por lo tanto, si se modifica el valor de un miembro de array, este valor se modifica en todas las instancias.
Para obtener arrays independientes en todas las instancias de las clases, debe declararse un array local de la siguiente manera:
SystemClass is Class
DefaultArray is local array of 1 int
END

Observación: A la get independiente arrays en todas las instancias de las clases:
  1. Abra la ventana de descripción del proyecto: en la pestaña "Proyecto", en el grupo "Proyecto", haga clic en "Descripción".
  2. En la pestaña "Compilación" seleccione "Arrays: la asignación copia el contenido".
Para obtener más información, consulte Descripción del proyecto, pestaña compilación.

Serialización de los miembros de una clase

Por Default, todos los miembros de una clase son seriados.
Tiene la capacidad de gestionar con precisión la serialización de cada miembro de la clase.:
  • especificando el miembro que será serializado durante la llamada a Serialize.
    Esta operación se puede realizar en todos los tipos de serialización (WXML, JSON, binario)..
  • cambiando el nombre del miembro durante la serialización con Serialize.
    Esta operación sólo se puede realizar durante una serialización binaria..
Esta gestión de serialización se realiza utilizando la siguiente sintaxis:
  • Serialización (o no) de un miembro:
    <Member name> is <Member type> [ = <Initial value>]
    [, Serialize = <True/False>]
  • Serialización y cambio de nombre de miembro:
    <Member name> is <Member type> [ = <Initial value>]
    [, Serialize = <New Name>]
    Ejemplo:
Cl is Class
// Serialized member
SerializedMember is int
// Non-serialized member
NonSerializedMember is string, Serialize = false  
// Member renamed during the serialization
RenamedMember is int, Serialize = "NewMemberName"
END

La vinculación de los datos

El enlace de datos está disponible para los miembros de la clase.

Generación de los métodos para acceder a un miembro de la clase (guardado para compatibilidad con versiones anteriores)

El editor de código se utiliza para generar los métodos para acceder a un miembro de la clase. Para esto:
  1. Declare a su miembro en la clase si aún no lo ha hecho.
  2. En el panel "Código", abra la clase description.
  3. Seleccione el miembro y elija "Generar los métodos de acceso" en el menú contextual.
    Generación de los métodos de acceso
  4. Se generan automáticamente dos nuevos métodos en la clase:
    • Escribe_<Nombre del miembro>
    • Reads_<Nombre del miembro>
Estos métodos se pueden utilizar para acceder al miembro.
Declaración de las constantes de clase

Sintaxis

CONSTANT <Constant name> = <Constant value>

CONSTANT
<Constant name> = <Constant value>
<Constant name> = <Constant value>
END

Sintaxis detallada

<Nombre constante>
Nombre definido para la constante. Una constante es pública.
<Valor constante...
Valora associated con la constante. Este valor no cambiará durante la ejecución del programa.

Ejemplo

CONSTANT K=5
CONSTANT
K=5
J=10
END
Declarando un singleton
A Singleton es una declaración de instancia de clase única.
Para declarar una instancia de clase única y asignarla inmediatamente, utilice la siguiente sintaxis:
<Name singleton class> is Class
GLOBAL
<Instance name> is <Name singleton class>
END
Ejemplo
CSingleton is Class
GLOBAL
m_Singleton is CSingleton
END
Creación y declaración de los métodos de clase

Creación de un método de clase

Para crear un método de clase:
  1. Visualizar el panel "Explorador de proyectos" si es necesario: en el panel "Inicio", en el grupo "Entorno", expanda "Paneles" y seleccione "Project explorer"..
  2. En el panel "Explorador del proyecto", mostrar las clases disponibles: Para ello, expanda la carpeta "Clases".
  3. Seleccione la clase deseada. Haga clic con el botón derecho del ratón para abrir el menú contextual de la clase y seleccione "Nuevo método".
  4. En la ventana que aparece:
    • Escriba el nombre del método.
    • Especifique si el comentario del prototipo del método se debe generar automáticamente (opción "Generar un comentario de encabezado").
      Para más detalles sobre los comentarios generados automáticamente, véase automatic documentación de procedimientos y métodos.
    • Especificar si el método es público, protegido o privado. Para más detalles, consulte la sección "Access" del Sintaxis detallada.
    • Especificar si el método es abstract. Para más detalles, consulte la sección "abstract" del Sintaxis detallada.
    • Especifique si el método es global. Para más detalles, consulte la sección "Global" del Sintaxis detallada.
    • Valide.
  5. El editor de código muestra el código del nuevo método.

Sintaxis para declarar un método

PROCEDURE [<Access>] [Global] [VIRTUAL] [ABSTRACT]
<Method name> ([<Parameter1>, ...[<ParameterN>]]) [<Extension attributes>]

Sintaxis detallada

<Acceso>: Opcional
Se utiliza para restringir el acceso a este método. Hay 3 niveles disponibles:
  • Privado : el método sólo puede ser llamado desde un código de la clase
  • Protegido : el método sólo puede llamarse desde un código de la clase o desde un código de una clase derivada
  • Public (por Default): el método puede ser llamado desde cualquier código de la clase o proyecto.
Global Global: Opcional
Define un método global. Este método no funcionará en un objeto específico: no se requiere ningún objeto de clase para llamar a este método. Esta clase también puede ser utilizada para manipular los miembros globales.
Virtual: Opcional
Define un método virtual. Un método anulado es virtual por Default.
abstract: Opcional
Define un método de abstract. Un método abstract es un método que debe redefinirse absolutamente en las clases derivadas. Un método no es abstract de Default.
<Nombre de método>
Nombre que identifica el método.
<Parámetro 1> ... <Parámetro N>
Parámetros opcionales para pasar al método.
<Atributo de extensión>
Atributos de extensión utilizados para definir las opciones de gestión del editor de código. Los atributos de extensión disponibles son:
  • <zombie [comment = "text"]>: Se utiliza para definir un método obsoleto (también llamado método zombie). La palabra clave opcional comment se utiliza para especificar el texto que se mostrará en el error de compilación associated con el método obsoleto. Para obtener más información, consulte Procedimientos de zombie.
  • <sin paso a paso>: Se usa para especificar que este método será ignorado por el depurador al depurar en modo "Paso a paso"..
GLOBAL procedure ViewObject(obj)
// The private member ClassSize is accessible from the class code
Info("Name: " + Obj:Name + "Size: " + Obj:ClassSize)
GLOBAL FUNCTION Attempt(a1,b1)
RESULT a1 + b1

Alcance identificado por la Color de la barra

Un método de una clase puede ser público, privado o protegido.
El color de inicio de la barra de Event cambia según el alcance del método:
  • rojo comienzo de la barra: método privado.
  • inicio de la barra de naranja: método protegido.
  • inicio estándar de la barra: método público.
Color de las barras de método

Borrar un método

Un método puede borrarse:
  • desde el panel "Explorador de proyectos" ("Eliminar" en el menú contextual)
  • desde el editor de códigos, a través de la el menú contextual de la barra de método ("Borrar").
Creación y declaración de propiedades

Presentación

Una Property es un elemento de código con dos eventos:
  • un evento para recuperar el valor,
  • un evento para asignar el valor.
Un Property puede ser usado como un Variable o como un miembro (recuperación directa del valor, asignación a través del símbolo '=', ...). En tiempo de ejecución:
  • Cualquier operación que requiera la lectura de la propiedad ejecuta el evento para recuperar el valor. Este evento debe devolver un valor.
  • Cualquier operación que requiera la escritura de la propiedad ejecuta el evento para asignar el valor. Este evento debe procesar un parámetro.
Universal Windows 10 App Las propiedades de clase no están disponibles.

Creando una clase Property

Para crear una clase Property:
  1. Visualizar el panel "Explorador de proyectos" si es necesario: en la pestaña "Inicio", en el grupo "Entorno", despliegue "Paneles" y seleccione "Explorador de proyectos".
  2. En el panel "Explorador del proyecto", mostrar las clases disponibles (ampliar la carpeta "Clases").
  3. Seleccione la clase deseada. Abra el menú contextual de la clase y seleccione la opción "Nueva propiedad".
  4. En la ventana que se abre, introduzca el nombre de la Property y valide.
  5. El editor de código muestra los eventos relacionados con la propiedad:
    • Event para recuperar la Property. Esta Event contiene:
      • la palabra clave "RESULT" que permite obtener el valor de la propiedad.
      • la palabra clave "RETURN =" para devolver el valor de la propiedad.
    • Event por asignar la Property. Este evento se permite dar un valor a la propiedad. Este valor se pasa como parámetro. Este evento no debe devolver resultados.
Observación: También se puede crear una nueva Property en el menú contextual de un miembro. En este caso, los procedimientos automáticamente manipular el miembro especificado.

La vinculación de los datos

El enlace de datos está disponible para las propiedades de las clases y los miembros de la llamada.

Derechos de acceso a una Property

La Property no puede ser leída si la recuperación de la Event está vacía.. Aparecerá un error de compilación en el editor y se producirá un error en tiempo de ejecución.
La propiedad no puede escribirse si la asignación Event está vacía. Aparecerá un error de compilación en el editor y se producirá un error en tiempo de ejecución.
Los eventos de recuperación y asignación pueden ser públicos, privados o protegidos. Los derechos de acceso de la Property corresponden a los derechos menos restrictivos de los dos eventos. Para obtener más información, consulte Derechos de acceso a una Property.
Las propiedades pueden ser globales. Una Property es global para la clase cuando los eventos de recuperación y asignación son globales. Si uno de los eventos es global, todos los eventos deben ser globales, de lo contrario se muestra un error de compilación.

Miembros y propiedades

Una Property y un miembro existente pueden tener el mismo nombre. En este caso, las órdenes de prioridad son las siguientes:
  • en los eventos de la Property, el miembro tiene prioridad sobre la Property.
  • en el resto del código, la Property tiene prioridad sobre el miembro.
Por lo tanto, un miembro puede ser reemplazado por una Property sin modificar el código que utiliza el miembro.
El evento de una Property no puede utilizar de forma recursiva la Property. Si ningún miembro tiene el mismo nombre que la Property, el uso de la Property en uno de sus eventos causará un error de compilación.

Herencia

Las propiedades de las clases base se heredan en las clases derivadas.
Una Property puede ser sobrecargada en una clase derivada. Los eventos de una Property siempre se consideran como virtuales: se ignora el uso de la palabra clave VIRTUAL.
La herencia múltiple está soportada por las propiedades. Las siguientes sintaxis pueden utilizarse para llamar a las propiedades de las clases base:
  • Ancestor.Property si la clase derivada tiene una sola clase base
  • BaseClass.Property en todos los casos.

Pasando propiedades como parámetros a una función de WLanguage o Procedure

Si el parámetro es pasado por reference (caso de Default) y no se escribe a mano:
  • la Property se pasa como parámetro.
  • no se ejecutan eventos asociados a la propiedad durante la llamada.
  • la lectura del parámetro formal ejecuta el código de recuperación de valor.
  • la escritura del parámetro formal ejecuta el código de asignación de valor.
Si el parámetro es por valor pasado (LOCAL) y no mecanografiado:
  • el valor de Property se pasa como parámetro.
  • el código de recuperación del valor se ejecuta durante la llamada.
  • la lectura del parámetro formal accede al valor pasado durante la llamada y no ejecuta el código de recuperación de valor.
  • la escritura del parámetro formal modifica el valor pasado durante la llamada y no ejecuta el código de asignación de valor.
Si el parámetro es pasado por reference (caso de Default) y se teclea:
  • la Property se pasa como parámetro.
  • el tipo de la propiedad debe ser correcto. De lo contrario, se produce un error WLanguage.
  • no se ejecutan eventos asociados a la propiedad durante la llamada.
  • la lectura del parámetro formal ejecuta el código de recuperación de valor.
  • la escritura del parámetro formal ejecuta el código de asignación de valor.
Si el parámetro es por valor pasado (LOCAL) y con tipo específico:
  • el valor de Property se pasa como parámetro.
  • el código de recuperación del valor se ejecuta durante la llamada.
  • si es necesario, el valor de la propiedad se convierte en el tipo del parámetro.
  • la lectura del parámetro formal accede al valor pasado durante la llamada y no ejecuta el código de recuperación de valor.
  • la escritura del parámetro formal modifica el valor pasado durante la llamada y no ejecuta el código de asignación de valor.
Instancias de clase con contexto HFSQL independiente

Presentación

Una copia del contexto HFSQL puede ser associated con una instancia de clase. Todos los accesos al HFSQL realizados desde los métodos y propiedades de la clase (llamadas a funciones o acceso a los registros) operan sobre la copy del contexto de la instancia de la clase.
Universal Windows 10 AppAndroidJava Esta funcionalidad no está disponible.

Sintaxis

Se debe utilizar la siguiente sintaxis:
// Declare the class
IndependentHFSQLClass is Class, independent <light/full> HFSQL context
END
o
// Declare the class
IndependentHFSQLClass is Class
<independent light/full HFSQL context>

END
Por ejemplo:
IndependentHFSQLClass is Class, independent light HFSQL context
Light/Full parámetro:
  • La palabra clave "ligero" desencadena la inmediata copy de parte del contexto HFSQL.
    Solo se almacenan los directorios que contienen los archivos de datos en modo HFSQL Classic y/o las conexiones en modo HFSQL Client/Server.
  • La palabra clave "completo" desencadena la inmediata copy del contexto HFSQL.
    Se recomienda si el hilo debe tener en cuenta las posiciones actuales en los archivos y consultas del contexto llamador.

aprovechamiento

El contexto HFSQL de la instancia se crea copiando el contexto actual durante la ejecución del constructor.
Los operadores = y <= entre dos instancias con contexto HFSQL independiente copy el contenido del contexto HFSQL.
No se recomienda utilizar instancias de clase con contextos HFSQL independientes para simular un alias en un único archivo HFSQL o en una Record específica de un archivo HFSQL. De hecho, copiar el contexto HFSQL afecta a todos los elementos del contexto (archivos, vistas, consultas, conexiones,...) y puede llevar bastante tiempo.
Una instancia de clase con un contexto HFSQL independiente sólo puede ser usada en el hilo que ejecuta el constructor. Para manipular una instancia de clase con contexto HFSQL independiente en varios hilos, debes hacerlo:
  • asignar una nueva instancia de la clase,
  • realizar una copy de la instancia de la fuente con el operador = o <=.
Notas

Leyenda de los iconos utilizados

Los diferentes iconos utilizados son los siguientes:
Público Procedure
Público Procedure
Protegido Procedure
Protegido Procedure
Soldado Procedure
Soldado Procedure
Método público virtual
Método público virtual
Método virtual protegido
Método virtual protegido
Método virtual privado
Método virtual privado
Método público global
Método público global
Método global protegido
Método global protegido
Método privado global
Método privado global
Constante
Constante

Nuevas características desde la versión 9

Una clase que contiene un miembro del personaje no tiene el mismo comportamiento que en las versiones anteriores. De hecho, los caracteres estaban codificados en 1 byte en las versiones anteriores y en 2 bytes desde la versión 9.
Le recomendamos que utilice el tipo "1 byte entero".
Versión mínima requerida
  • Versión 10
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 27/05/2022

Señalar un error o enviar una sugerencia | Ayuda local