Java Language
Envoi de méthode dynamique
Recherche…
Introduction
Qu'est-ce que Dynamic Method Dispatch?
Dynamic Method Dispatch est un processus dans lequel l'appel à une méthode substituée est résolu à l'exécution plutôt qu'à la compilation. Lorsqu'une méthode substituée est appelée par une référence, Java détermine la version de cette méthode à exécuter en fonction du type d'objet auquel elle fait référence. Ceci est également connu sous le nom de polymorphisme d'exécution.
Nous verrons cela à travers un exemple.
Remarques
- Liaison dynamique = liaison tardive
- Les classes abstraites ne peuvent pas être instanciées, mais elles peuvent être sous-classées (Base pour une classe enfant)
- Une méthode abstraite est une méthode déclarée sans implémentation
- La classe abstraite peut contenir un mélange de méthodes déclarées avec ou sans implémentation
- Lorsqu'une classe abstraite est sous-classée, la sous-classe fournit généralement des implémentations pour toutes les méthodes abstraites de sa classe parente. Toutefois, si ce n'est pas le cas, la sous-classe doit également être déclarée abstraite.
- La distribution de méthode dynamique est un mécanisme par lequel un appel à une méthode remplacée est résolu au moment de l'exécution. C'est ainsi que Java implémente le polymorphisme d'exécution.
- Mise à jour: Transférer un sous-type sur un sur-type vers le haut de l'arbre d'héritage.
- Polymorphisme d'exécution = Polymorphisme dynamique
Dynamic Method Dispatch - Exemple de code
Classe abstraite:
package base;
/*
Abstract classes cannot be instantiated, but they can be subclassed
*/
public abstract class ClsVirusScanner {
//With One Abstract method
public abstract void fnStartScan();
protected void fnCheckForUpdateVersion(){
System.out.println("Perform Virus Scanner Version Check");
}
protected void fnBootTimeScan(){
System.out.println("Perform BootTime Scan");
}
protected void fnInternetSecutiry(){
System.out.println("Scan for Internet Security");
}
protected void fnRealTimeScan(){
System.out.println("Perform RealTime Scan");
}
protected void fnVirusMalwareScan(){
System.out.println("Detect Virus & Malware");
}
}
Remplacement de la méthode abstraite dans la classe enfant:
import base.ClsVirusScanner;
//All the 3 child classes inherits the base class ClsVirusScanner
//Child Class 1
class ClsPaidVersion extends ClsVirusScanner{
@Override
public void fnStartScan() {
super.fnCheckForUpdateVersion();
super.fnBootTimeScan();
super.fnInternetSecutiry();
super.fnRealTimeScan();
super.fnVirusMalwareScan();
}
}; //ClsPaidVersion IS-A ClsVirusScanner
//Child Class 2
class ClsTrialVersion extends ClsVirusScanner{
@Override
public void fnStartScan() {
super.fnInternetSecutiry();
super.fnVirusMalwareScan();
}
}; //ClsTrialVersion IS-A ClsVirusScanner
//Child Class 3
class ClsFreeVersion extends ClsVirusScanner{
@Override
public void fnStartScan() {
super.fnVirusMalwareScan();
}
}; //ClsTrialVersion IS-A ClsVirusScanner
La liaison dynamique / tardive conduit à l'envoi dynamique de la méthode:
//Calling Class
public class ClsRunTheApplication {
public static void main(String[] args) {
final String VIRUS_SCANNER_VERSION = "TRIAL_VERSION";
//Parent Refers Null
ClsVirusScanner objVS=null;
//String Cases Supported from Java SE 7
switch (VIRUS_SCANNER_VERSION){
case "FREE_VERSION":
//Parent Refers Child Object 3
//ClsFreeVersion IS-A ClsVirusScanner
objVS = new ClsFreeVersion(); //Dynamic or Runtime Binding
break;
case "PAID_VERSION":
//Parent Refers Child Object 1
//ClsPaidVersion IS-A ClsVirusScanner
objVS = new ClsPaidVersion(); //Dynamic or Runtime Binding
break;
case "TRIAL_VERSION":
//Parent Refers Child Object 2
objVS = new ClsTrialVersion(); //Dynamic or Runtime Binding
break;
}
//Method fnStartScan() is the Version of ClsTrialVersion()
objVS.fnStartScan();
}
}
Résultat :
Scan for Internet Security
Detect Virus & Malware
Reprise:
objVS = new ClsFreeVersion();
objVS = new ClsPaidVersion();
objVS = new ClsTrialVersion()
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow