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