1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz
2 Callback fv: egy megadott típusú (szignatúrájú fv)-t mint paramétert adunk át. Ezen fv vissza lehet hívni. A fv szignatúrát rögzíteni kell, mint típust: delegate void PercentCallback( int ); KulcsszóVisszatérési típusA típus neveA fv paraméterezése
3 delegate void PercentCallback( int ); class ZIP_Osztaly { public static void Becsom(string inpFile, PercentCallBack fv ) { … file megnyitasa … int szazalek_kesz = 0; while (!nincs_file_vege()) { … egy szakasz becsomagolasa … szazalek_kesz ++; fv( szazalek_kesz ); } … file lezárása … } delegate void PercentCallback( int ); class ZIP_Osztaly { public static void Becsom(string inpFile, PercentCallBack fv ) { … file megnyitasa … int szazalek_kesz = 0; while (!nincs_file_vege()) { … egy szakasz becsomagolasa … szazalek_kesz ++; fv( szazalek_kesz ); } … file lezárása … }
4 class sajatOsztaly { public static void Kiir(int szazalek) { Console.WriteLine(‘#’); } class sajatOsztaly { public static void Kiir(int szazalek) { Console.WriteLine(‘#’); } delegate void PercentCallback( int ); Megfelel a ‘PercentCallBack’ szignatúrájának Becsom(”C:/proba.txt”, new PercentCallBack( sajatOsztaly.Kiir )); Átadjuk neki a PercentCallBack szignatúrának megfelelő fv-t. Ezt a fv-t fogja becsomagolás közben visszahívni…
5 class sajatOsztaly { public void Kiir(int szazalek) { Console.WriteLine(‘#’); } class sajatOsztaly { public void Kiir(int szazalek) { Console.WriteLine(‘#’); } delegate void PercentCallback( int ); Megfelel a ‘PercentCallBack’ szignatúrájának, de példányszintű! sajatOsztaly s = new sajatOsztaly(); Becsom(”C:/proba.txt”, new PercentCallBack( s.Kiir )); sajatOsztaly s = new sajatOsztaly(); Becsom(”C:/proba.txt”, new PercentCallBack( s.Kiir )); Átadjuk neki a PercentCallBack szignatúrának megfelelő fv-t. Ezt a fv-t fogja becsomagolás közben visszahívni…
6 delegate void PercentCallback( int ); class ZIP_Osztaly { public static PercentCallback callBackFV = null; public static void Becsom(string inpFile) { … file megnyitasa … int szazalek_kesz = 0; while (!nincs_file_vege()) { … egy szakasz becsomagolasa … szazalek_kesz ++; if (callBackFV != null) callBackFV ( szazalek_kesz ); } … file lezárása … } delegate void PercentCallback( int ); class ZIP_Osztaly { public static PercentCallback callBackFV = null; public static void Becsom(string inpFile) { … file megnyitasa … int szazalek_kesz = 0; while (!nincs_file_vege()) { … egy szakasz becsomagolasa … szazalek_kesz ++; if (callBackFV != null) callBackFV ( szazalek_kesz ); } … file lezárása … } Callback fv típusú mező…
7 public static ArrayList callBackFV_List = new ArrayList(); public static void Becsom(string inpFile) { … foreach( PercentCallback fv in callBackFV_LIST) fv( szazalek_kesz ); } public static ArrayList callBackFV_List = new ArrayList(); public static void Becsom(string inpFile) { … foreach( PercentCallback fv in callBackFV_LIST) fv( szazalek_kesz ); } Nem egy, de több visszahívandó fv kezelése… ZIP_Osztaly.callBackFV_List.Add( new PercentCallBack( sajatOsztaly.Kiir ) ); Becsom(”C:/proba.txt”); ZIP_Osztaly.callBackFV_List.Add( new PercentCallBack( sajatOsztaly.Kiir ) ); Becsom(”C:/proba.txt”); Nem garantált, hogy az ArrayList-be csak ilyen fv-ek kerülnek bele!!!
8 private static ArrayList callBackFV_List = new ArrayList(); public static void AddFv( PercentCallBack fv ) { callBackFV_List.Add( fv ); } public static void RemoveFv( PercentCallBack fv ) { callBackFV_List.Remove( fv ); } private static ArrayList callBackFV_List = new ArrayList(); public static void AddFv( PercentCallBack fv ) { callBackFV_List.Add( fv ); } public static void RemoveFv( PercentCallBack fv ) { callBackFV_List.Remove( fv ); } Típushelyesség kikényszerítése…. ZIP_Osztaly.AddFv( new PercentCallBack( sajatOsztaly.Kiir ) ); Becsom(”C:/proba.txt”); ZIP_Osztaly.RemoveFv( new PercentCallBack( sajatOsztaly.Kiir ) ); ZIP_Osztaly.AddFv( new PercentCallBack( sajatOsztaly.Kiir ) ); Becsom(”C:/proba.txt”); ZIP_Osztaly.RemoveFv( new PercentCallBack( sajatOsztaly.Kiir ) );
9 public static event PercentCallback callBackFV_LIST; public static void Becsom(string inpFile) { … if (callBackFV_LIST != null) callBackFV_LIST( szazalek_kesz ); } public static event PercentCallback callBackFV_LIST; public static void Becsom(string inpFile) { … if (callBackFV_LIST != null) callBackFV_LIST( szazalek_kesz ); } Az ‘event’ szóval deklaráljuk, hogy a callBackFV_LIST egyszerre több fv-t is képes tárolni. Ezen fv-ek mindegyikét a fenti egyszerű szintaxissal meg tudjuk hívni. delegate void PercentCallback( int );
10 ZIP_Osztaly.callBackFV_List + = new PercentCallBack( sajatOsztaly.Kiir ) ); Becsom(”C:/proba.txt”); ZIP_Osztaly.callBackFV_List - = new PercentCallBack( sajatOsztaly.Kiir ) ); ZIP_Osztaly.callBackFV_List + = new PercentCallBack( sajatOsztaly.Kiir ) ); Becsom(”C:/proba.txt”); ZIP_Osztaly.callBackFV_List - = new PercentCallBack( sajatOsztaly.Kiir ) ); += -el lehet feliratkozni az visszahívási listára -= -el lehet leiratkozni