Takaisinsoitto C/C++:ssa: Mekanismia funktion kutsumiseksi toisesta funktiosta kutsutaan takaisinkutsuksi. Funktion muistiosoite esitetään "funktioosoittimena" kielissä, kuten C ja C++. Joten takaisinsoitto saavutetaan siirtämällä funktion 1() osoitin funktioon 2().
Takaisinsoitto Javassa: Mutta takaisinsoittofunktion käsitettä ei ole Javassa, koska Javalla ei ole osoitinkonseptia. On kuitenkin tilanteita, joissa voidaan puhua takaisinsoittoobjektista tai takaisinsoittorajapinnasta. Sen sijaan, että välität funktion muistiosoitteen välitetään käyttöliittymä, joka viittaa funktion sijaintiin.
Esimerkki
Otetaan esimerkki, jotta ymmärrämme, missä takaisinsoittoja voidaan käyttää. Oletetaan, että ohjelmoija haluaa suunnitella verolaskurin, joka laskee valtion kokonaisveron. Oletetaan, että on vain kaksi veroa keskus- ja valtionvero. Keskusvero on yleinen, kun taas valtion vero vaihtelee osavaltioittain. Kokonaisvero on näiden kahden summa. Tässä erillinen menetelmä, kuten stateTax() toteutetaan jokaiselle tilille ja kutsuu tätä menetelmää toisesta menetelmästä laskeaTax() seuraavasti:
static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }
Edellisessä koodissa stateTax()-osoite välitetään laskentaan Tax(). LaskeTax()-menetelmä käyttää tätä osoitetta tietyn osavaltion stateTax()-menetelmän kutsumiseen, ja osavaltiovero "st" lasketaan.
Koska stateTax()-menetelmän koodi muuttuu tilasta toiseen, on parempi ilmoittaa se abstraktiksi menetelmäksi käyttöliittymässä seuraavasti:
interface STax { double stateTax(); }
Seuraava on StateTax():n käyttöönotto Punjabin osavaltiossa:
class Punjab implements STax{ public double stateTax(){ return 3000.0; } }
Seuraava on stateTax():n toteutus HP-tilalle:
class HP implements STax { public double stateTax() { return 1000.0; } }
LaskeTax()-menetelmä voidaan nyt suunnitella seuraavasti:
static void calculateTax(STax t) { // calculate central tax double ct = 2000.0; // calculate state tax double st = t.stateTax(); double totaltax = st + ct; // display total tax System.out.println(Total tax =+totaltax); } Tarkkaile tässä parametria 'STax t' laskentaTax() -menetelmässä. "t" on viite "STAx"-rajapinnalle, joka välitetään parametrina menetelmälle. Tätä viittausta käyttämällä stateTax()-menetelmää kutsutaan seuraavasti:
double st = t.stateTax();
Tässä jos "t" viittaa Punjab-luokan stateTax()-menetelmään, kyseinen menetelmä kutsutaan ja sen vero lasketaan. Sama luokka HP. Tällä tavalla välittämällä rajapintaviittauksen laskentaTax()-menetelmään on mahdollista kutsua minkä tahansa tilan stateTax()-metodia. Tätä kutsutaan takaisinsoittomekanismi.
Ohjaamalla menetelmään viittaavan rajapintaviitteen on mahdollista kutsua ja käyttää kyseistä menetelmää toisesta menetelmästä.
// Java program to demonstrate callback mechanism // using interface is Java // Create interface import java.util.Scanner; interface STax { double stateTax(); } // Implementation class of Punjab state tax class Punjab implements STax { public double stateTax() { return 3000.0; } } // Implementation class of Himachal Pradesh state tax class HP implements STax { public double stateTax() { return 1000.0; } } class TAX { public static void main(String[] args) throws ClassNotFoundException IllegalAccessException InstantiationException { Scanner sc = new Scanner(System.in); System.out.println('Enter the state name'); String state = sc.next(); // name of the state // The state name is then stored in an object c Class c = Class.forName(state); // Create the new object of the class whose name is in c // Stax interface reference is now referencing that new object STax ref = (STax)c.newInstance(); /*Call the method to calculate total tax and pass interface reference - this is callback . Here ref may refer to stateTax() of Punjab or HP classes depending on the class for which the object is created in the previous step */ calculateTax(ref); } static void calculateTax(STax t) { // calculate central tax double ct = 2000.0; // calculate state tax double st = t.stateTax(); double totaltax = st + ct; // display total tax System.out.println('Total tax =' + totaltax); } }
Lähtö:
Enter the state name Punjab Total tax = 5000.0
Viitteet:
Kuinka ottaa takaisinsoittotoimintoja käyttöön Javassa?
Java-ydin: Integroitu lähestymistapa