Classes
Vue d’ensemble
Le langage 4D prend en charge le concept de classes. Dans un langage de programmation, l'utilisation d'une classe vous permet de définir le comportement d'un objet avec des propriétés et des fonctions associées.
Une fois qu'une classe utilisateur est définie, vous pouvez instancier des objets de cette classe n'importe où dans votre code. Chaque objet est une instance de sa classe. Une classe peut étendre
une autre classe, et hérite ensuite de ses fonctions et propriétés (déclarées et calculées).
Les modèles de classe 4D et JavaScript sont similaires, et basés sur une chaîne de prototypes.
Par exemple, vous pouvez créer une classe Person
avec la définition suivante :
//Class: Person.4dm
Class constructor($firstname : Text; $lastname : Text)
This.firstName:=$firstname
This.lastName:=$lastname
Function get fullName() -> $fullName : Text
$fullName:=This.firstName+" "+This.lastName
Function sayHello() -> $welcome : Text
$welcome:="Hello "+This.fullName
Dans une méthode, créons une "Personne" :
var $person : cs.Person //objet de classe Person
var $hello : Text
$person:=cs.Person.new("John";"Doe")
// $person:{firstName: "John"; lastName: "Doe"; fullName: "John Doe"}
$hello:=$person.sayHello() //"Hello John Doe"
Gestion des classes
Définition d'une classe
Une classe utilisateur dans 4D est définie par un fichier méthode (.4dm) spécifique, stocké dans le dossier /Project/Sources/Classes/
. Le nom du fichier est le nom de la classe.
Lorsque vous nommez des classes, gardez à l'esprit les règles suivantes :
- Un nom de classe doit être conforme aux règles de nommage des propriétés.
- Les noms de classe sont sensibles à la casse.
- Il n'est pas recommandé de donner le même nom à une classe et à une table de base de données, afin d'éviter tout conflit.
Par exemple, si vous souhaitez définir une classe nommée "Polygon", vous devez créer le fichier suivant :
Project folder Project Sources Classes Polygon.4dm
Supprimer une classe
Pour supprimer une classe existante, vous pouvez :
- sur votre disque, supprimer le fichier de classe .4dm du dossier "Classes",
- dans l'explorateur 4D, sélectionner la classe et cliquez sur ou choisissez Déplacer dans la corbeille dans le menu contextuel.
Utilisation de l'interface 4D
Les fichiers de classe sont automatiquement stockés à l'emplacement approprié lorsqu'ils sont créés via l'interface de 4D, soit via le menu Fichier, soit via l'Explorateur.
Menu Fichier et barre d'outils
Vous pouvez créer un nouveau fichier de classe pour le projet en sélectionnant Nouveau> Classe... dans le menu Fichier de 4D ou dans la barre d'outils.
Vous pouvez également utiliser le raccourci Ctrl+Maj+Alt+k.
Explorateur
Dans la page Méthodes de l'Explorateur, les classes sont regroupées dans la catégorie Classes.
Pour créer une nouvelle classe, vous pouvez :
- sélectionner la catégorie Classes et cliquez sur le bouton .
- sélectionner Nouvelle classe... dans le menu d'actions en bas de la fenêtre de l'Explorateur ou dans le menu contextuel du groupe Classes.
- sélectionnez Nouveau> Classe... dans le menu contextuel de la page d'accueil de l'Explorateur.
Prise en charge du code de classe
Dans les différentes fenêtres 4D (éditeur de code, compilateur, débogueur, explorateur d'exécution), le code de classe est essentiellement géré comme une méthode projet avec quelques spécificités :
- Dans l'éditeur de code :
- une classe ne peut pas être exécutée
- une fonction de classe est un bloc de code
- Aller à définition... sur un objet membre permet de rechercher des déclarations de fonction de classe; par exemple, "$o.f()" donnera comme résultat de recherche "Function f".
- Chercher les références... sur la déclaration de fonction de classe recherche la fonction utilisée comme membre d'objet; par exemple, "Function f" donnera comme résultat "$o.f()".
- Dans l'explorateur d'exécution et le débogueur, les fonctions de classe sont affichées avec le constructeur
<ClassName>
ou le format<ClassName>.<FunctionName>
.
Class stores
Les classes disponibles sont accessibles depuis leurs class stores. Il existe deux class stores dans 4D :
cs
pour le class store utilisateur4D
pour le class store intégré
cs
cs : Object
Paramètres | Type | Description | ||
---|---|---|---|---|
classStore | Object | <- | Class store utilisateur utilisateurs pour le projet ou le composant |
La commande cs
retourne le class store utilisateur pour le projet ou le composant courant. Elle retourne toutes les classes utilisateur définies dans le projet ou le composant ouvert. Par défaut, seules les classes ORDA du projet sont disponibles.
Exemple
Vous souhaitez créer une nouvelle instance d'un objet de myClass
:
$instance:=cs.myClass.new()
4D
4D : Object
Paramètres | Type | Description | ||
---|---|---|---|---|
classStore | Object | <- | Class store 4D |
La commande 4D
retourne le class store des classes 4D intégrées disponibles. Elle donne accès à des API spécifiques telles que CryptoKey.
Exemple
Vous souhaitez créer une nouvelle clé dans la classe CryptoKey
:
$key:=4D.CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))
L'objet classe
Lorsqu'une classe est définie dans le projet, elle est chargée dans l'environnement de langage 4D. Une classe est un objet lui-même de la classe "Class". Un objet classe possède les propriétés et fonctions suivantes :
- chaîne
name
- objet
superclass
(null s'il n'y en a pas) - fonction
new()
, permettant d'instancier les objets de la classe - propriété
isShared
, true si la classe est partagée - propriété
isSingleton
, true si la classe définit une classe singleton. - propriété
me
, permettant d'instancier et d'accéder aux singletons.
De plus, un objet classe peut référencer un objet constructor
(facultatif).
Un objet classe lui-même est un objet partagé et est donc accessible simultanément à partir de différents process 4D.
Héritage
Si une classe hérite d'une autre classe (c'est-à-dire que le mot-clé Class extends est utilisé dans sa définition), la classe parente est sa superclass
.
Quand 4D ne trouve pas une fonction ou une propriété dans une classe, elle la recherche dans sa superclass
; si elle n'est pas trouvée, 4D continue la recherche dans la superclass de la superclass, et ainsi de suite, jusqu'à ce qu'il n'y ait plus de superclass (tous les objets héritent de la superclass "Object").
Mots-clés de classe
Des mots-clés 4D spécifiques peuvent être utilisés dans les définitions de classe :
Function <Name>
pour définir les fonctions de classe des objets.Class constructor
pour initialiser les nouveaux objets de la classe.property
pour définir les propriétés statiques des objets d'un type donné.Function get <Name>
etFunction set <Name>
pour définir les propriétés calculées des objets.Class extends <ClassName>
pour définir l'héritage.
Function
Syntaxe
{shared} Function <name>({$parameterName : type; ...}){->$parameterName : type}
// code
Les fonctions de classe sont des propriétés spécifiques de la classe. Ce sont des objets de la classe 4D.Function. Dans le fichier de définition de classe, les déclarations de fonction utilisent le mot-clé Function
suivi du nom de la fonction.
Si la fonction est déclarée dans une classe partagée, vous pouvez utiliser le mot-clé shared
pour que la fonction puisse être appelée sans structure Use. .End use
. Pour plus d'informations, consultez le paragraphe sur les fonctions partagées ci-dessous.
Le nom de la fonction doit être conforme aux règles de nommage des objets.
Étant donné que les propriétés et les fonctions partagent le même espace de nommage, il n'est pas permis d'utiliser le même nom pour une propriété et une fonction de la même classe (une erreur est générée dans ce cas).
Si vous préfixez le nom d'une fonction par un trait de soulignement ("_"), elle ne sera pas proposée par les fonctionnalités d'auto-complétion dans l'éditeur de code 4D. Par exemple, si vous déclarez Function _myPrivateFunction
dans MyClass
, elle ne sera pas proposée dans l'éditeur de code lorsque vous tapez "cs.MyClass. "
.
Immédiatement après le nom de la fonction, des paramètres peuvent être déclarés pour la fonction avec un nom et un type de données, y compris le paramètre de retour (facultatif). Par exemple :
Function computeArea($width : Integer; $height : Integer)->$area : Integer
Dans une fonction de classe, la commande This
est utilisée comme instance d'objet. Par exemple :
Function setFullname($firstname : Text; $lastname : Text)
This.firstName:=$firstname
This.lastName:=$lastname
Function getFullname()->$fullname : Text
$fullname:=This.firstName+" "+Uppercase(This.lastName)
Pour une fonction de classe, la commande Current method name
retourne : <ClassName>.<FunctionName>
, par exemple "MyClass.myFunction".
Dans le code de l'application, les fonctions de classes sont appelées comme des méthodes membres des instances d'objets et peuvent recevoir des paramètres si besoin. Les syntaxes suivantes sont prises en charge :
- utilisation de l'opérateur
()
. Par exemple,myObject.methodName("hello")
- utilisation d'une méthode membre de la classe "4D.Function" :
Si une fonction de classe n'est pas thread-safe et qu'elle est appelée par une méthode avec l'attribut "Peut être exécutée dans un process preémptif" :
- le compilateur ne génère pas d'erreur (ce qui est différent par rapport aux méthodes standard),
- une erreur est déclenchée par 4D uniquement au moment de l'exécution.
Paramètres
Les paramètres des fonctions sont déclarés via le nom du paramètre et son type, séparés par deux-points. Le nom du paramètre doit être conforme aux règles de nommage des propriétés. Les paramètres multiples (et leurs types) sont séparés par des points-virgules (;).
Function add($x; $y : Variant; $z : Integer; $xy : Object)
Si le type n'est pas fourni, le paramètre sera défini comme Variant
.
Valeur retournée
Vous déclarez le paramètre de retour d'une fonction (optionnel) en ajoutant une flèche (->
) et la définition du paramètre de retour après la liste des paramètres d'entrée, ou les deux points (:
) et le tye de paramètre de retour uniquement. Par exemple :
Function add($x : Variant; $y : Integer)->$result : Integer
$result:=$x+$y
Vous pouvez également déclarer le paramètre de retour en ajoutant seulement : type
et utiliser l'expression return
(elle mettra également fin à l'exécution de la fonction). Par exemple :
Function add($x : Variant; $y : Integer): Integer
// some code
return $x+$y
Exemple 1
property name : Text
property height; width : Integer
// Class: Rectangle
Class constructor($width : Integer; $height : Integer)
This.name:="Rectangle"
This.height:=$height
This.width:=$width
// Function definition
Function getArea()->$result : Integer
$result:=(This.height)*(This.width)
// Dans une méthode projet
var $rect : cs.Rectangle
var $area : Real
$rect:=cs.Rectangle.new(50;100)
$area:=$rect.getArea() //5000
Exemple 2
Cet exemple utilise l'expression return
:
Function getRectArea($width : Integer; $height : Integer) : Integer
If ($width > 0 && $height > 0)
return $width * $height
Else
return 0
End if
Class Constructor
Syntaxe
// Class: MyClass
{shared} {singleton} Class Constructor({$parameterName : type; ...})
// code
Une fonction class constructor accepte des paramètres facultatifs et peut être utilisée pour créer et initialiser des objets de la classe utilisateur.
Lorsque vous appelez la fonction new()
, le constructeur de classe est appelé avec les paramètres éventuellement passés à la fonction new()
.
Il ne peut y avoir qu'une seule fonction constructor dans une classe (sinon une erreur est renvoyée). Un constructeur peut utiliser le mot-clé Super
pour appeler le constructeur de la superclass.
Vous pouvez créer et saisir des propriétés d'instance dans le constructeur (voir exemple). Alternativement, si les valeurs de vos propriétés d'instance ne dépendent pas des paramètres passés au constructeur, vous pouvez les définir en utilisant le mot-clé property
.
L'utilisation du mot-clé shared
crée une classe partagée, utilisée pour n'instancier que des objets partagés. Pour plus d'informations, reportez-vous au paragraphe Classes partagées.
L'utilisation du mot-clé singleton
crée un singleton, utilisé pour créer une seule instance. Pour plus d'informations, référez-vous au paragraphe Classes singleton.
Exemple
// Class: MyClass
// Class constructor of MyClass
Class Constructor ($name : Text ; $age : Integer)
This.name:=$name
This.age:=$age
// Dans une méthode projet
// Vous pouvez instancier un objet
var $o : cs.MyClass
$o:=cs.MyClass.new("John";42)
// $o = {"name" : "HelloWorld" ; "age":42}
propriété
Syntaxe
property <propertyName>{; <propertyName2>;...}{ : <propertyType>}
Le mot-clé property
permet de déclarer une propriété à l'intérieur d'une classe utilisateur. Une propriété de classe a un nom et un type.
La déclaration des propriétés des classes améliore les suggestions de l'éditeur de code, les fonctions d'auto-complétion et la détection des erreurs.
Les propriétés sont déclarées pour les nouveaux objets lorsque vous appelez la fonction new()
, mais elles ne sont pas automatiquement ajoutées aux objets (elles ne sont ajoutées que lorsqu'une valeur leur est assignée).
Une propriété est automatiquement ajoutée à l'objet lorsqu'elle est initialisée dans la ligne de déclaration.
Les noms des propriétés doivent être conformes aux règles de nommage des propriétés.
Étant donné que les propriétés et les fonctions partagent le même espace de nommage, il n'est pas permis d'utiliser le même nom pour une propriété et une fonction de la même classe (une erreur est générée dans ce cas).
Le type de propriété peut être l'un des suivants :
propertyType | Contenu |
---|---|
Text | Valeur texte |
Date | Valeur date |
Time | Valeur Heure |
Boolean | Valeur booléen |
Integer | Valeur entier long |
Real | Valeur réel |
Pointer | Valeur pointeur |
Picture | Valeur image |
Blob | Valeur Blob scalaire |
Collection | Valeur collection |
Variant | Valeur variant |
Object | Objet de classe par défaut (4D.Object) |
4D.<className> | Object de la classe 4D className |
cs.<className> | Object de la classe utilisateur className |
cs.<namespace>.<className> | Object de la classe className du composant <namespace> |
Si vous omettez le type dans la ligne de déclaration, la propriété est créée en tant que variant.
Le mot-clé property
ne peut être utilisé que dans les méthodes de classe et en dehors de tout bloc Function
ou Class Constructor
.