Suche…


Einführung

Was ist dynamischer Methodenversand?

Dynamic Method Dispatch ist ein Prozess, bei dem der Aufruf einer überschriebenen Methode zur Laufzeit und nicht zur Kompilierungszeit aufgelöst wird. Wenn eine überschriebene Methode von einer Referenz aufgerufen wird, bestimmt Java anhand des Objekttyps, auf die sie verweist, welche Version dieser Methode ausgeführt werden soll. Dies ist auch als Laufzeitpolymorphismus bekannt.

Wir werden das an einem Beispiel sehen.

Bemerkungen

  • Dynamische Bindung = Späte Bindung
  • Abstrakte Klassen können nicht instanziiert werden, sie können jedoch Unterklassen zugeordnet werden (Basis für eine untergeordnete Klasse).
  • Eine abstrakte Methode ist eine Methode, die ohne Implementierung deklariert wird
  • Abstrakte Klassen können eine Mischung von Methoden enthalten, die mit oder ohne Implementierung deklariert wurden
  • Wenn eine abstrakte Klasse eine Unterklasse ist, stellt die Unterklasse normalerweise Implementierungen für alle abstrakten Methoden ihrer übergeordneten Klasse bereit. Wenn dies nicht der Fall ist, muss die Unterklasse auch als abstrakt deklariert werden
  • Dynamic Method Dispatch ist ein Mechanismus, durch den ein Aufruf einer überschriebenen Methode zur Laufzeit aufgelöst wird. So implementiert Java Laufzeitpolymorphismus.
  • Upcasting: Umwandeln eines Untertyps in einen Supertyp, aufwärts zum Vererbungsbaum.
  • Laufzeitpolymorphismus = dynamischer Polymorphismus

Dynamic Method Dispatch - Beispielcode

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

Überschreiben der abstrakten Methode in der Kindklasse:

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 / späte Bindung führt zum dynamischen Methodenversand:

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

    }
}

Ergebnis:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow