Поддерживает ли Java многократную отправку? Если нет, то как работает приведенный ниже код?

Поддерживает ли Java многократную отправку? Если нет, то как работает приведенный ниже код?

Account.java

public interface Account 
{
    public void calculateInterest();
}

SavingsAccount.java

public class SavingsAccount implements Account
{

}

LoanAccount.java

public class LoanAccount implements Account
{

}

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

CalculateInterest.java

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

Выход

Процентная ставка по кредиту составляет 11,5%
Процентная ставка по Сберегательному счету составляет 6,5%

1 ответ

Решение

Сначала немного терминологии

Перегрузка - это возможность создавать несколько методов с одинаковыми именами в разных реализациях.

В Java это выполняется на основе типа аргументов во время компиляции: метод с совпадающей сигнатурой используется независимо от значения аргумента.

Переопределение позволяет подклассу или дочернему классу предоставлять конкретную реализацию метода, которая уже предоставлена ​​одним из его суперклассов или родительских классов.

В Java это выполняется путем определения вызываемого метода в зависимости от динамического (динамического) типа объекта, на который ссылаются. Это способ Java реализовать единую диспетчеризацию, и его не следует путать с перегрузкой.

Многократная диспетчеризация означает, что функция или метод могут быть динамически отправлены на основе динамического (динамического) типа времени выполнения или, в более общем случае, какого-либо другого атрибута, более чем одного из его аргументов.

Поддерживает ли Java множественную диспетчеризацию?

В Java нет прямой поддержки множественной отправки.

Однако вы можете эмулировать несколько отправлений, используя несколько слоев одной отправки в сочетании с перегрузкой.

Как работает этот код?

Обратите внимание, что этот код для работы в первую очередь требует, чтобы вы предоставили реализацию 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 (" %");
    }
}

Онлайн демо

Другие вопросы по тегам