v0.2.12
This commit is contained in:
86
chapters/017-construction-et-destruction.md
Normal file
86
chapters/017-construction-et-destruction.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# 17. Construction et destruction
|
||||
|
||||
## 17.1 Constructeur unique — V1 REQUIS — FIGÉ
|
||||
|
||||
Une classe ou struct possède au maximum un `construct` effectif explicite ou synthétique.
|
||||
|
||||
Pas de surcharge de constructeur.
|
||||
|
||||
## 17.2 Visibilité de `construct` — V1 REQUIS — FIGÉ
|
||||
|
||||
Classe :
|
||||
|
||||
```text
|
||||
private
|
||||
protected
|
||||
module
|
||||
package
|
||||
public
|
||||
```
|
||||
|
||||
Struct :
|
||||
|
||||
```text
|
||||
private
|
||||
module
|
||||
package
|
||||
public
|
||||
```
|
||||
|
||||
`unsafe construct` est autorisé si l'appelant doit garantir des invariants que le compilateur ne peut pas vérifier.
|
||||
|
||||
## 17.3 Construction dérivée — V1 REQUIS — FIGÉ
|
||||
|
||||
Chaque classe possède son propre constructeur effectif ; les constructeurs ne sont pas hérités comme des méthodes.
|
||||
|
||||
Le compilateur peut synthétiser un constructeur à partir :
|
||||
|
||||
- du constructeur effectif du parent immédiat ;
|
||||
- des nouveaux champs qui nécessitent une initialisation.
|
||||
|
||||
Chaîne :
|
||||
|
||||
```text
|
||||
C -> B -> A
|
||||
```
|
||||
|
||||
Jamais `C -> A` directement.
|
||||
|
||||
## 17.4 `super::construct(...)` — V1 REQUIS — FIGÉ
|
||||
|
||||
Il doit être exécuté exactement une fois sur chaque chemin de construction valide avant toute utilisation de l'état parent via `this`/`super`.
|
||||
|
||||
Il n'a pas besoin d'être textuellement la première instruction : des calculs locaux indépendants peuvent le précéder.
|
||||
|
||||
Le compilateur doit prouver la definite construction.
|
||||
|
||||
Avant construction du parent, sont notamment interdits :
|
||||
|
||||
```text
|
||||
this::field
|
||||
this::method()
|
||||
super::method()
|
||||
escape/capture/pass de this
|
||||
```
|
||||
|
||||
## 17.5 Destructeur — V1 REQUIS — FIGÉ EN PRINCIPE
|
||||
|
||||
Au maximum un `destruct` effectif.
|
||||
|
||||
Le destructeur est un hook de lifecycle automatiquement invoqué.
|
||||
|
||||
Il n'est pas appelable directement par le programmeur et ne possède donc pas de visibilité utilisateur normale.
|
||||
|
||||
```text
|
||||
destruct() {
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
S'il doit effectuer des opérations unsafe, il utilise un bloc `unsafe` interne.
|
||||
|
||||
## 17.6 Fallibilité de `construct`/`destruct` — V1 REQUIS — À FINALISER
|
||||
|
||||
Le lien exact avec `Result`, exceptions, construction partielle et cleanup doit être fermé avec le modèle mémoire et les exceptions.
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user