.NET Delegate 2. rész

MEGOSZTÁS

Ha tetszett a cikk, akkor nyugodtan oszd meg ismerőseiddel, valószínű ők is örülni fognak neki.

A delegate-ek .NET-ben típusos metódusreferenciákat jelentenek, hasonlóak a C és C++ függvény pointereihez. Egy  delegate létrehozásával egy olyan változót definiálunk, mellyel  rámutathatunk egy olyan metódusra, amely típusa (paraméterlistája és visszatérési értéke) megfelel a delegate típusának. Ebben a bejegyzésben folytatom a delegate-ek sajátosságainak bemutatását az osztályok tagfüggvényeinek meghívásával, valamint a multicast delegate-ek használatával.

Tagfüggvény meghívása delegate segítségével

A következő egyszerű példában egy naplózást megvalósító programrészlet található. A MyClass nevű osztály Process() metódusának lefutását naplózza. Ezen funkció megvalósításához szükség van egy void visszatérési értékű, string paraméterű delegate definiálására. A Process() metódus törzsében a delegate segítségével átadásra kerülnek a naplózandó string típusú információk.

A FileLogger osztály segítségével valósul meg a fájlba történő naplózás (stream nyitás, zárás). A delegate a FileLogger osztály Logger() tagfüggvényét használja a fájlba naplózáshoz.

A TestApplication osztályban történik a delegate példányosítása. A delegate példány (myLogger) rámutat a FileLogger típusú fl nevű objektum Logger() metódusára. A delegate meghívásával a fl.Logger() metódus hívódik meg a delegate számára megadott paraméterrel.

 

public class MyClass
{
        public delegate void LogHandler(string message);
        
        public void Process(LogHandler logHandler)
        {
            if (logHandler != null)
            {
                logHandler(“Process() begin”);
            }

            if (logHandler != null)
            {
                logHandler(“Process() end”);
            }
        }
}

 

public class FileLogger
{
        FileStream fileStream;
        StreamWriter streamWriter;
        public FileLogger(string filename)
        {
            fileStream = new FileStream(filename, FileMode.Create);
            streamWriter = new StreamWriter(fileStream);
        }

        public void Logger(string s)
        {
            streamWriter.WriteLine(s);
        }

        public void Close()
        {
            streamWriter.Close();
            fileStream.Close();
        }
}

 

public class TestApplication
{
        static void Main(string[] args)
        {
            FileLogger fl = new FileLogger(“process.log”);

            MyClass myClass = new MyClass();

            MyClass.LogHandler myLogger = new MyClass.LogHandler(fl.Logger);
            myClass.Process(myLogger);
            fl.Close();
        }
}

Multicast delegate

Az alábbi kódrészlet a multicast delegate-ek használatát mutatja be. Látható, hogy egy delegate több metódusra is rá tud mutatni (amik megfelelnek a delegate típusának(paraméterlista, visszatérési érték)), ennek köszönhetően a delegate hívásakor az összes beregisztrált metódus meghívódik.

A példában előzőekben használt MyClass és FileLogger osztályok itt is változatlan formában megtalálhatók. A TestApplication osztály kis mértékben változott. Létrehozásra került egy statikus Logger() függvény, ami a konzolra írja ki a megfelelő szöveges naplóinformációkat a delegate segítségével. A Main függvényben megtörténik a delegate példányosítása (myLogger), majd a delagate rámutat a TestApplication osztályban található statikus Logger() függvényre, és a FileLogger típusú fl nevű objektum Logger() tagfüggvényére is. A delegát meghívásával az értékül adott (beregisztrált) mindkét metódus automatikusan meghívódik a delegáthívásban megadott paraméterrel.

public class TestApplication
{
        static void Logger(string s)
        {
            Console.WriteLine(s);
        }
        static void Main(string[] args)
        {
            FileLogger fl = new FileLogger(“process.log”);
            MyClass myClass = new MyClass();
            MyClass.LogHandler myLogger = null;
            myLogger += new MyClass.LogHandler(Logger);
            myLogger += new MyClass.LogHandler(fl.Logger);
            myClass.Process(myLogger);
            fl.Close();
        }
}

Írta: Sallai Máté

Forrás

 

MEGOSZTÁS

Ha tetszett a cikk, akkor nyugodtan oszd meg ismerőseiddel, valószínű ők is örülni fognak neki.

HOZZÁSZÓLÁS

Ha nem hagy nyugodni az, amit a cikkben olvastál, akkor nyugodtan írd meg kérdésed vagy észrevételed kommentbe. Így szerzőnk könnyen tud neked válaszolni.

Vélemény, hozzászólás?