Une méthode est une fonction qui attribue des comportements à un objet ; elle se divise en quatre catégories : méthodes d’instance, surcharge des opérateurs, Getters/Setters et méthodes abstraites.
1. Instance methods Méthodes d’instance
- Méthodes appartenant aux instances d’une classe ;
- Accès direct aux variables d’instance et utilisation du mot-clé
thisautorisée ; - Corps de fonction complet pour réaliser des calculs métier et des traitements logiques.
import 'dart:math';
class Point {
final double x;
final double y;
// Constructeur initialisant les variables d'instance
Point(this.x, this.y);
// Méthode d'instance : calculer la distance entre deux points
double distanceTo(Point other) {
var dx = x - other.x;
var dy = y - other.y;
return sqrt(dx * dx + dy * dy);
}
}
void main() {
Point p1 = Point(0, 0);
Point p2 = Point(3, 4);
print(p1.distanceTo(p2)); // Affiche 5.0
}Langage du code : JavaScript (javascript)
2. Operators Surcharge des opérateurs
- La plupart des opérateurs sont en réalité des méthodes d’instance à nom spécial ;
- Syntaxe de déclaration :
operator opérateur(paramètre) TypeRetour { ... }; - Liste des opérateurs surchargeables :
< > <= >= == ~- + / ~/ * %| ˆ & << >>> >>[]= [] - Certains opérateurs natifs ne peuvent pas être surchargés (ex:
!=, implémenté automatiquement par Dart sans définition manuelle) ; - La surcharge de
==impose de redéfinir simultanémenthashCode, sinon les comparaisons d’égalité présenteront des anomalies.
class Vector {
final int x, y;
Vector(this.x, this.y);
// Surcharge de l'opérateur + pour l'addition vectorielle
Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
// Surcharge de l'opérateur - pour la soustraction vectorielle
Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
// Surcharge de == pour la comparaison d'égalité
@override
bool operator ==(Object other) =>
other is Vector && x == other.x && y == other.y;
// Redéfinition associée de hashCode
@override
int get hashCode => Object.hash(x, y);
}
void main() {
final v = Vector(2, 3);
final w = Vector(2, 2);
assert(v + w == Vector(4, 5));
assert(v - w == Vector(0, 1));
print(v + w);
}Langage du code : JavaScript (javascript)
Après surcharge des opérateurs, nous pouvons appliquer des opérateurs numériques comme +, -, == sur deux objets Vector exactement comme sur des nombres.
3. Getters and setters Accesseurs
get: méthode en lecture seule, récupère une propriété calculée, sans paramètres ;set: méthode en écriture, modifie une variable liée, un seul paramètre autorisé ;- Toutes les variables d’instance disposent d’un getter implicite ; les variables mutables possèdent également un setter implicite ;
- Avantage : transformer ultérieurement une variable simple en logique de calcul sans modifier le code appelant externe ;
- Les opérateurs d’incrément/décrément
++/--n’appellent le getter qu’une seule fois et mettent en cache la valeur pour éviter les effets secondaires.
/// Rectangle du système de coordonnées écran, origine (0,0) en haut à gauche
class Rectangle {
double left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
// Getter : calculer la limite droite
double get right => left + width;
// Setter : affecter la limite droite et mettre à jour left en sens inverse
set right(double value) => left = value - width;
// Getter : calculer la limite basse
double get bottom => top + height;
// Setter : affecter la limite basse et mettre à jour top en sens inverse
set bottom(double value) => top = value - height;
}
void main() {
var rect = Rectangle(3, 4, 20, 15);
assert(rect.left == 3);
// Appel du setter
rect.right = 12;
assert(rect.left == -8);
print(rect.left); // -8
}Langage du code : JavaScript (javascript)
4. Abstract methods Méthodes abstraites
- Définit uniquement une interface sans corps de fonction ; un point-virgule
;remplace l’implémentation ; - Ne peut exister que dans une
abstract classclasse abstraite ou un mixin ; - Les sous-classes doivent redéfinir et implémenter l’intégralité des méthodes abstraites, sinon la sous-classe doit aussi être marquée
abstract.
// Classe abstraite contenant une méthode abstraite
abstract class Doer {
// Méthode abstraite : déclaration seule, pas d'implémentation
void doSomething();
}
// Sous-classe concrète, doit implémenter toutes les méthodes abstraites parentes
class EffectiveDoer extends Doer {
@override
void doSomething() {
print("Exécuter la logique métier concrète");
}
}
void main() {
Doer worker = EffectiveDoer();
worker.doSomething(); // Affiche : Exécuter la logique métier concrète
}Langage du code : JavaScript (javascript)
Comparatif
| Type de méthode | Caractéristiques principales | Identifiant syntaxique | Cas d’utilisation |
|---|---|---|---|
| Méthode d’instance Instance | Accès aux variables d’instance, corps logique complet | Définition de fonction classique | Comportements classiques des objets (calculs, traitements métier) |
| Surcharge d’opérateur Operator | Méthode d’instance à nom spécial, mot-clé operator | operator +() etc. | Addition, soustraction, indexation et comparaison d’égalité pour objets personnalisés |
| Getter/Setter | Lecture/écriture de propriétés ; get sans paramètre, set à un paramètre | get / set | Encapsuler des propriétés calculées, point d’accès unique en lecture/écriture externe |
| Méthode abstraite Abstract | Pas de corps de méthode, déclaration d’interface uniquement | Point-virgule ; après la signature | Définition de spécifications dans une classe parente abstraite, implémentation obligatoire pour les sous-classes |