Java Language
Dynamisk metodsändning
Sök…
Introduktion
Vad är Dynamic Method Dispatch?
Dynamic Method Dispatch är en process där samtalet till en åsidosatt metod löses under körning snarare än vid kompileringstid. När en åsidosatt metod kallas av en referens, bestämmer Java vilken version av den metoden som ska köras baserat på typen av objekt den refererar till. Detta är också känt som runtime polymorfism.
Vi kommer att se detta genom ett exempel.
Anmärkningar
- Dynamisk bindning = Sen bindning
- Abstrakta klasser kan inte instanseras, men de kan underklassas (bas för en barnklass)
- En abstrakt metod är en metod som förklaras utan implementering
- Abstrakt klass kan innehålla en blandning av metoder som deklarerats med eller utan implementering
- När en abstrakt klass underklassas ger underklassen vanligtvis implementeringar av alla abstrakta metoder i sin moderklass. Om det inte gör det, måste underklassen också förklaras abstrakt
- Dynamisk metodsändning är en mekanism genom vilken ett samtal till en åsidosatt metod löses under körning. Så här implementerar java runtime polymorfism.
- Upcasting: Casting av en subtyp till en supertyp, uppåt till arvträdet.
- Runtime Polymorphism = Dynamisk polymorfism
Dynamisk metodsändning - exempelkod
Abstrakt klass:
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");
}
}
Överbryta abstrakt metod i barnklass:
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
Dynamisk / sen bindning leder till dynamisk metodsändning:
//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();
}
}
Resultat :
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow