Java Language
Método dinámico de envío
Buscar..
Introducción
¿Qué es el método dinámico de envío?
Dynamic Method Dispatch es un proceso en el que la llamada a un método anulado se resuelve en tiempo de ejecución en lugar de en tiempo de compilación. Cuando se llama a un método anulado por una referencia, Java determina qué versión de ese método se ejecutará según el tipo de objeto al que se refiere. Esto también se conoce como polimorfismo de tiempo de ejecución.
Veremos esto a través de un ejemplo.
Observaciones
- Enlace dinámico = Enlace tardío
- Las clases abstractas no pueden ser instanciadas, pero pueden ser subclasificadas (Base para una clase infantil)
- Un método abstracto es un método que se declara sin una implementación
- La clase abstracta puede contener una mezcla de métodos declarados con o sin una implementación
- Cuando una clase abstracta está subclasificada, la subclase generalmente proporciona implementaciones para todos los métodos abstractos en su clase principal. Sin embargo, si no lo hace, entonces la subclase también debe ser declarada abstracta
- El envío de métodos dinámicos es un mecanismo mediante el cual una llamada a un método anulado se resuelve en tiempo de ejecución. Así es como Java implementa el polimorfismo en tiempo de ejecución.
- Upcasting: Convertir un subtipo en un supertipo, hacia arriba en el árbol de herencia.
- Polimorfismo en tiempo de ejecución = polimorfismo dinámico
Método dinámico de envío - Código de ejemplo
Clase abstracta :
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");
}
}
Método abstracto superior en la clase infantil:
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
El enlace dinámico / tardío conduce al envío del método dinámico:
//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();
}
}
Resultado:
Scan for Internet Security
Detect Virus & Malware
Upcasting:
objVS = new ClsFreeVersion();
objVS = new ClsPaidVersion();
objVS = new ClsTrialVersion()
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow