105 lines
2.4 KiB
Markdown
105 lines
2.4 KiB
Markdown
# 16. Dispatch, override et modificateurs
|
|
|
|
## 16.1 Ordre canonique — V1 REQUIS — FIGÉ
|
|
|
|
Ordre des modificateurs :
|
|
|
|
```text
|
|
visibility
|
|
-> safety
|
|
-> linkage / ABI
|
|
-> type / dispatch modifiers
|
|
-> override
|
|
-> access qualifier
|
|
-> declaration kind
|
|
```
|
|
|
|
Puis :
|
|
|
|
```text
|
|
Name<...>
|
|
-> extends ...
|
|
-> implements ...
|
|
```
|
|
|
|
`extends` et `implements` sont des clauses après le nom, pas des modificateurs.
|
|
|
|
Exemples :
|
|
|
|
```text
|
|
public final class User
|
|
public open class Service
|
|
public abstract class Base
|
|
public unsafe extern "C" union NativeValue
|
|
protected open method calculate(...)
|
|
protected const method inspect(...)
|
|
protected override method calculate(...)
|
|
protected final override const method inspect(...)
|
|
```
|
|
|
|
Les ordres alternatifs sont des erreurs syntaxiques même s'ils seraient théoriquement compréhensibles.
|
|
|
|
## 16.2 Méthodes overridables — V1 REQUIS — FIGÉ
|
|
|
|
Une méthode nouvellement déclarée n'est pas overridable par défaut.
|
|
|
|
Elle doit être explicitement :
|
|
|
|
```text
|
|
open method
|
|
```
|
|
|
|
ou :
|
|
|
|
```text
|
|
abstract method
|
|
```
|
|
|
|
Un descendant utilise :
|
|
|
|
```text
|
|
override method
|
|
```
|
|
|
|
Pour fermer ensuite la chaîne :
|
|
|
|
```text
|
|
final override method
|
|
```
|
|
|
|
`final method` sur une nouvelle méthode n'apporte rien et n'est pas nécessaire : l'absence de `open` suffit.
|
|
|
|
Même modèle pour `clsmethod` si elle participe au dispatch de classe.
|
|
|
|
## 16.3 Visibilité d'override — V1 REQUIS — FIGÉ
|
|
|
|
Un override conserve exactement la visibilité du contrat hérité.
|
|
|
|
Pas d'élargissement ni de réduction implicite.
|
|
|
|
Une exposition plus large nécessite un wrapper explicite.
|
|
|
|
## 16.4 `protected` — V1 REQUIS — FIGÉ EN PRINCIPE
|
|
|
|
`protected` existe uniquement dans le modèle d'héritage de classe et signifie « accessible depuis les classes dérivées » en plus de la classe déclaratrice.
|
|
|
|
Les détails d'accès via une autre instance d'une classe dérivée doivent être figés dans les règles finales de résolution membre.
|
|
|
|
## 16.5 Qualification `const` dans les contrats — V1 REQUIS — FIGÉ
|
|
|
|
La qualification `const` d'une méthode fait partie de son contrat de mutation.
|
|
|
|
Une implémentation ou un override doit conserver exactement cette qualification en V1.
|
|
|
|
```text
|
|
const method
|
|
doit être implémentée/overridée par const method
|
|
|
|
method
|
|
doit être implémentée/overridée par method
|
|
```
|
|
|
|
Saselang n'effectue pas de changement implicite de mutabilité dans une hiérarchie de contrats.
|
|
|
|
---
|