수색…


소개

다이내믹 메소드 디스패치 란 무엇입니까?

동적 메서드 디스패치는 재정의 된 메서드에 대한 호출이 컴파일 타임이 아닌 런타임에 해석되는 프로세스입니다. 오버라이드 된 메소드가 참조에 의해 호출 될 때 Java는 참조하는 객체 유형에 따라 실행할 메소드 버전을 판별합니다. 이것은 또한 런타임 다형성으로 알려져 있습니다.

우리는 이것을 통해 예를 보게 될 것입니다.

비고

  • 동적 바인딩 = 후기 바인딩
  • 추상 클래스는 인스턴스화 할 수 없지만 하위 클래스 (하위 클래스의 경우 Base)
  • 추상 메소드는 구현없이 선언 된 메소드입니다.
  • 추상 클래스는 구현의 유무에 관계없이 선언 된 메소드를 포함 할 수 있습니다.
  • 추상 클래스가 하위 클래스 인 경우 하위 클래스는 일반적으로 상위 클래스의 모든 추상 메서드에 대한 구현을 제공합니다. 그러나 그렇지 않은 경우 하위 클래스도 abstract로 선언되어야합니다.
  • 동적 메서드 디스패치는 런타임에 재정의 된 메서드에 대한 호출을 해결하는 메커니즘입니다. 이것은 java가 런타임 다형성을 구현하는 방법입니다.
  • Upcasting : 하위 유형을 상위 유형으로 3 스팅하여 상속 트리로 위로 향하게합니다.
  • 런타임 다형성 = 동적 다형성

동적 메서드 디스패치 - 예제 코드

추상 클래스 :

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

자식 클래스에서 추상 메서드 재정의 :

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 

동적 / 늦은 바인딩은 동적 메서드 디스패치로 연결됩니다.

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

    }
}

결과 :

Scan for Internet Security  
Detect Virus & Malware

추방 :

objVS = new ClsFreeVersion();
objVS = new ClsPaidVersion();
objVS = new ClsTrialVersion()


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow