WebElektronika

A ToString() metódus felülírása a C# nyelvben

person access_time 2018.01.30.
Az objektumorientált nyelvekben (OOP), így a C# nyelvben is létezik az, hogy egy metódust felülírunk, azaz, az eredeti metódus neve nem változik meg, de nem az eredeti metódus kerül meghívásra, hanem egy másik osztályban található, de ugyanilyen nevű metódus. Ez az öröklés során fordulhat elő. Megnézzük most a ToString() metódus felülírását. Ez az ősosztályban, az Object-ben található, ezt fogjuk felülírni. Ezután a következő példában pedig nem felülírjuk a ToString() metódust, hanem az IFormattable interfészt implementáljuk.


Indítsuk el a Visual Studio-t, és hozzunk létre egy "ConsoleToString1" nevű Console projektet.

Másoljuk be a következő kódot a Program.cs file-ba.

namespace ConsoleToString1
{
    class resztvevo
    {
        public string Nev { get; set; }
        public string Varos { get; set; }

        public override string ToString()
        {
            return "A résztvevő adatai : \t" +
                "Név : " + Nev + " - " + "Város : " + Varos;
            //return base.ToString();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            resztvevo laci = new resztvevo
            { Nev = "László", Varos = "Budapest" };

            Console.WriteLine(laci.ToString());

            Console.ReadLine();
        }
    }
}

 

A ConsoleToString1 névtérben lévő "resztvevo" osztály tartalmaz két property-t, illetve a felülírt ToString() metódust. Ezt nem kell nekünk "kézzel" beírni. A "resztvevo" osztályban kezdjük el beírni az "override" szót, és a fejlesztőkörnyezetünk felkínálja az Object osztályban lévő metódusokat, és ekkor tudjuk kiválasztani a ToString()-et (1. ábra).

kep
1. ábra   A felülírt ToString() metódus létrehozása
 

Hozzuk létre a fejlesztőkörnyezetünk segítségével a ToString() metódust (2. ábra), majd a tartalmát módosítsuk.

kep
2. ábra   Létrehoztuk a ToString() metódust
 

A Program osztályban lévő Main() metódusban a "resztvevo" osztályt példányosítjuk "laci" néven és ekkor adunk értéket a két property-nek is.
Ezután a Console osztály WriteLine() metódusát hívjuk meg úgy, hogy a "laci" nevű példányt megjelenítjük a felülírt ToString() segítségével.
Futtassuk debug módban a programunkat, és következő eredményt kapjuk (3. ábra).

kep
3. ábra   Futási eredmény
 

Látható, hogy a "laci" példány property-einek az értékét a kiegészítő megjegyzésekkel írtuk ki a konzolra.

A ToString() metódus módosítására létezik egy másik lehetőség is, amikor nem felülírjuk ezt a metódust, hanem implementáljuk az IFormattable interfészt.

Másoljuk be a  következő kódot a Program.cs file-ba. Látható, hogy az előző példaprogram kiegészítésre került egy újabb osztállyal, amelynek a neve "tanfolyam". Ezt az osztályt az IFormattable nevű interfész segítségével implementáltuk. Amikor létrehoztuk az osztályt az implementálás során, akkor a fejlesztő eszközünk a ToString() metódust implmentálta, de úgy, hogy a metódusnak a törzse nem került megvalósításra, azt nekünk kell utána megadnunk.

namespace ConsoleToString1
{
    class resztvevo
    {
        public string Nev { get; set; }
        public string Varos { get; set; }

        public override string ToString()
        {
            return "A résztvevő adatai : \t" +
                "Név : " + Nev + " - " + "Város : " + Varos;
            //return base.ToString();
        }
    }

    class tanfolyam : IFormattable
    {
        public string Nev { get; set; }
        public string Varos { get; set; }

        public string ToString(string format, IFormatProvider formatProvider)
        {
            if (format == "n")
                return Nev;
            else if (format == "v")
                return Varos;
            else if (format == "nv")
                return "Név : " + Nev + " - Város : " + Varos;
            else
                return "Nincs kijelölve megjelenítendő elem....";
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            resztvevo laci = new resztvevo
            { Nev = "László", Varos = "Budapest" };

            Console.WriteLine(laci.ToString());

            tanfolyam t1 = new tanfolyam
            { Nev = "ASP.NET", Varos = "Tata" };
            
            Console.WriteLine(t1.ToString("n", null));
            Console.WriteLine(t1.ToString("v", null));
            Console.WriteLine(t1.ToString("nv", null));
            Console.WriteLine(t1.ToString("y", null));

            Console.ReadLine();
        }
    }
}

 

A "tanfolyam" osztályban lévő ToString() metódust úgy írtuk meg, hogy paraméteresen tudjuk meghívni. Az implementálást alkalmazva más lehetőségünk nincs is, hiszen az IFormattable intérfészben található ToString() metódus szignatúrája így került kialakításra.
A meghíváskor átadott paramétereket a "format"-tal hasonlítjuk össze. A másik paramétert (formatProvider) nem használjuk, meghíváskor a "null" értéket kapja meg.

Futtassuk újra debug módban az alkalmazásunkat, az eredményt a 4. ábrán látjuk.

kep
4. ábra   A ToString() metódus   Futási eredmény

Először a ToString() metódus felülírásának az eredménye látható, majd a "tanfolyam" osztály példányosításakor (t1) a property-knek megadott értékek.

A "t1" példányt a Console.WriteLine() segítségével jelenítjük meg úgy, hogy a ToString() metódus első paraméterének az értékét változtatjuk. Látható a  4. ábrán, hogy ennek a segítségével módosítani tudjuk a "t1" példány property-einek a megjelenítését.