Hériter d’une classe Extend a class
Utilisez le mot-clé extends pour dériver une sous-classe à partir d’une super-classe (classe parente).
Employez le mot-clé super pour appeler les membres de la classe parente (méthodes, constructeurs, etc.) depuis une sous-classe.
class Television {
void turnOn() {
...
// Code exécuté dans la méthode de la classe parente
}
}
// SmartTelevision est la sous-classe, Television est la super-classe
class SmartTelevision extends Television {
@override
void turnOn() {
super.turnOn(); // Appel de la méthode turnOn de la classe parente
// Code spécifique à la sous-classe
...
}
}Langage du code : Dart (dart)
Par exemple, une télévision classique représente la classe parente, et la télévision intelligente la sous-classe : la télévision intelligente hérite de la télévision classique.
extends a un autre cas d’utilisation : le contenu relatif aux types paramétrés vu dans le chapitre sur les génériques.
Exemple concret
class Television {
void turnOn() {
print("Mise sous tension de la télévision, activation de l'affichage de base");
}
}
// SmartTelevision est la sous-classe, Television est la super-classe
class SmartTelevision extends Television {
@override
void turnOn() {
super.turnOn(); // Appel de la méthode turnOn de la classe parente
// Code spécifique à la sous-classe
print("Télévision intelligente : activer le module réseau, charger l'écran d'accueil du système intelligent");
}
}
void main() {
// Instance de télévision classique
Television normalTv = Television();
print("===== Démarrage télévision classique =====");
normalTv.turnOn();
// Instance de télévision intelligente
SmartTelevision smartTv = SmartTelevision();
print("\n===== Démarrage télévision intelligente =====");
smartTv.turnOn();
}Langage du code : Dart (dart)
Résultat d’exécution
D:\dartdemo\firstdart>dart run
Building package executable... (1.4s)
Built firstdart:firstdart.
===== Démarrage télévision classique =====
Mise sous tension de la télévision, activation de l'affichage de base
===== Démarrage télévision intelligente =====
Mise sous tension de la télévision, activation de l'affichage de baseLangage du code : PHP (php)
Redéfinition des membres Overriding members
1. Éléments redéfinissables
Une sous-classe peut redéfinir : méthodes d’instance (y compris les opérateurs), getters, setters.
2. L’annotation @override
Rôle : déclarer explicitement que cette méthode redéfinit volontairement un membre de la classe parente et permettre au compilateur d’effectuer les vérifications.
class Television {
set contrast(int value) {}
}
class SmartTelevision extends Television {
@override // Indique au compilateur que cette méthode redéfinit celle de la classe parente
set contrast(num value) {}
}
Langage du code : JavaScript (javascript)
3. Règles à respecter pour la redéfinition
- Type de retour : le type de retour de la méthode redéfinie doit correspondre à celui de la méthode parente ou être un sous-type de celui-ci.
- Type des paramètres : le type des paramètres de la méthode redéfinie doit correspondre à celui de la méthode parente ou être un super-type. (Exemple :
int→num. num est un super-type de int, c’est autorisé.) - Nombre de paramètres positionnels : si la méthode initiale possède n paramètres positionnels, la méthode redéfinie doit également en avoir exactement n.
- Contraintes génériques : une méthode générique ne peut pas redéfinir une méthode non générique et inversement.
4. Le mot-clé covariant (cas particulier de restriction de type)
Les règles standards interdisent de restreindre le type d’un paramètre (une conversion descendante peut provoquer une erreur de type à l’exécution) ;
Si le développeur garantit qu’aucune erreur de type ne surviendra, ajoutez le marqueur covariant sur le paramètre pour permettre la restriction du type de paramètre.
Lorsque vous redéfinissez l’opérateur ==, vous devez également redéfinir le getter hashCode hérité de Object.
noSuchMethod ()
1. Rôle
Lorsque le code tente d’appeler une méthode d’instance / variable d’instance inexistante, vous pouvez redéfinir noSuchMethod() pour intercepter l’appel et définir un traitement personnalisé.
Si elle n’est pas redéfinie, l’accès à un membre absent lève directement une NoSuchMethodError.
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ${invocation.memberName}');
}
}
Langage du code : JavaScript (javascript)
- Objet
Invocation: stocke les informations de l’appel (nom du membre, paramètres, etc.)
2. Deux conditions pour appeler une méthode non implémentée (une suffit)
- Le type statique de l’objet receveur de l’appel est
dynamic; - Le type statique du receveur déclare cette méthode non implémentée (peut être une méthode abstraite), et le type dynamique du receveur propose une implémentation de
noSuchMethod()différente de la version native deObject.
Exemple
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ${invocation.memberName}');
// Affichage complémentaire des paramètres et du type d’appel pour voir toutes les informations
print('Paramètres de l’appel:${invocation.arguments}');
print('Type d’appel:${invocation.runtimeType}');
}
}
void main() {
A obj = A();
// Appel d’une méthode absente, déclenche noSuchMethod
obj.hello("test", 123);
// Accès à une propriété inexistante
obj.unknownValue;
}Langage du code : Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:6:30: Error: The getter 'arguments' isn't defined for the type 'Invocation'.
- 'Invocation' is from 'dart:core'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'arguments'.
print('cal:${invocation.arguments}');
^^^^^^^^^
bin/firstdart.dart:14:7: Error: The method 'hello' isn't defined for the type 'A'.
- 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'hello'.
obj.hello("test", 123);
^^^^^
bin/firstdart.dart:16:7: Error: The getter 'unknownValue' isn't defined for the type 'A'.
- 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unknownValue'.
obj.unknownValue;Langage du code : PHP (php)
Héritage de classe et redéfinition des membres