java支持多个调度吗?如果不是,以下代码如何工作?

时间:2017-05-14 04:43:41

标签: java polymorphism multiple-dispatch

java支持多个调度吗?如果不是,以下代码如何工作?

Account.java

public class SavingsAccount implements Account
{

}

SavingsAccount.java

public class LoanAccount implements Account
{

}

LoanAccount.java

public class InterestCalculation 
{
    public void getInterestRate(Account objAccount)
    {
        System.out.println("Interest Rate Calculation for Accounts");
    }

    public void getInterestRate(LoanAccount loanAccount)
    {
        System.out.println("Interest rate for Loan Account is 11.5%");
    }

    public void getInterestRate(SavingsAccount savingAccount)
    {
        System.out.println("Interest rate for Savings Account is 6.5%");
    }
}

InterestCalculation.java

public class CalculateInterest 
{
     public static void main(String[] args) 
     {
         InterestCalculation objIntCal = new InterestCalculation();
         objIntCal.getInterestRate(new LoanAccount());
         objIntCal.getInterestRate(new SavingsAccount());        
     }
}

CalculateInterest.java

{{1}}

输出

Interest rate for Loan Account is 11.5%
Interest rate for Savings Account is 6.5%

1 个答案:

答案 0 :(得分:0)

首先是一些术语

  

Overloading是创建多种方法的能力   具有不同实现的同名。

在Java中,这是基于参数的编译时类型执行的:使用matching signature的方法,与参数的值无关。

  

Overriding允许子类或子类提供   一个已经提供的方法的具体实现   它的超类或父类。

在Java中,这是通过根据所引用对象的运行时(动态)类型确定要调用的方法来执行的。这是Java实现single dispatch的方式,它是not be confused with overloading

  

Multiple dispatch表示函数或方法可以   动态调度基于运行时(动态)类型或,在   更一般的情况是一些其他属性,不止一个   参数

Java是否支持多个调度?

在Java中,没有直接支持多个调度。

但是,您可以emulate multiple dispatch使用多个单一调度层并结合重载。

这段代码是如何工作的?

请注意,要首先使用此代码,您需要为calculateInterest()LoanAccount提供SavingAccount的实施,即使它不会在您的其他POC中使用。

在您的班级InterestCalculation中,您有三种不同的方法getInterestRate()重载。它们每个都有一个独特的签名(例如参数类型)。因此main()将根据声明的参数类型(从构造函数推导出来)调用正确的方法。

您可以优化单个调度的使用,并使InterestCalculation更加通用(例如,您可以添加更多Account的实现,而无需更改它):

public interface Account 
{
    public void calculateInterest();
    public double getInterest(); 
    public String getType(); 
}
...
public class InterestCalculation 
{
    public void getInterestRate(Account objAccount)
    {
        System.out.print ("Interest Rate for "+objAccount.getType()+" is ");
        System.out.print (objAccount.getInterest());
        System.out.println (" %");
    }
}

Online demo