Java Language
Dynamiczna metoda wysyłki
Szukaj…
Wprowadzenie
Co to jest dynamiczna metoda wysyłki?
Dynamiczne wysyłanie metod to proces, w którym wywołanie zastąpionej metody jest rozstrzygane w czasie wykonywania, a nie w czasie kompilacji. Gdy odwołanie wywołuje zastąpioną metodę, Java określa, którą wersję tej metody wykonać, na podstawie typu obiektu, do którego się odnosi. Jest to również znane jako polimorfizm środowiska uruchomieniowego.
Zobaczymy to na przykładzie.
Uwagi
- Dynamiczne wiązanie = późne wiązanie
- Klasy abstrakcyjne nie mogą być tworzone, ale można je podklasować (podstawa dla klasy podrzędnej)
- Metoda abstrakcyjna to metoda zadeklarowana bez implementacji
- Klasa abstrakcyjna może zawierać mieszankę metod zadeklarowanych z implementacją lub bez
- Gdy klasa abstrakcyjna jest podklasowana, podklasa zwykle zapewnia implementacje dla wszystkich metod abstrakcyjnych w swojej klasie nadrzędnej. Jeśli jednak tak nie jest, podklasę należy również uznać za abstrakcyjną
- Dynamiczna metoda wysyłania jest mechanizmem, za pomocą którego wywołanie zastąpionej metody jest rozwiązywane w czasie wykonywania. W ten sposób Java implementuje polimorfizm środowiska wykonawczego.
- Upcasting: rzutowanie podtypu na nadtyp, w górę do drzewa dziedziczenia.
- Runtime Polymorphism = Dynamiczny polimorfizm
Dynamiczna metoda wysyłki - przykładowy kod
Klasa abstrakcyjna:
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");
}
}
Przesłanianie metody abstrakcyjnej w klasie potomnej:
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
Dynamiczne / późne wiązanie prowadzi do wysyłki metody dynamicznej:
//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();
}
}
Wynik:
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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow