Zoeken…


Invoering

Wat is dynamische methode verzending?

Dynamische methode verzending is een proces waarbij de aanroep van een overschreven methode wordt opgelost tijdens runtime in plaats van tijdens het compileren. Wanneer een overschreven methode wordt aangeroepen door een verwijzing, bepaalt Java welke versie van die methode moet worden uitgevoerd op basis van het type object waarnaar het verwijst. Dit staat ook bekend als runtime polymorphism.

We zullen dit door een voorbeeld zien.

Opmerkingen

  • Dynamische binding = late binding
  • Abstracte klassen kunnen niet worden geïnstantieerd, maar ze kunnen wel worden onderverdeeld (basis voor een onderliggende klas)
  • Een abstracte methode is een methode die zonder implementatie wordt gedeclareerd
  • Abstracte klasse kan een combinatie van methoden bevatten die al dan niet zijn geïmplementeerd
  • Wanneer een abstracte klasse is onderverdeeld, biedt de subklasse meestal implementaties voor alle abstracte methoden in de bovenliggende klasse. Als dit niet het geval is, moet de subklasse echter ook abstract worden verklaard
  • Dynamische methode verzending is een mechanisme waarmee een aanroep van een overschreven methode wordt opgelost tijdens runtime. Dit is hoe Java runtime polymorfisme implementeert.
  • Upcasting: een subtype naar een supertype casten, omhoog naar de erfenisboom.
  • Runtime Polymorphism = Dynamic Polymorphism

Dynamische methode verzending - Voorbeeldcode

Abstracte klasse:

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");
    }    
}

Abstracte methode overschrijven in Child Class:

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 

Dynamische / late binding leidt tot verzending van dynamische methode:

//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();

    }
}

Resultaat :

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow