martedì 9 settembre 2014

Interfacce in C#

Ecco: vediamo le interfacce...

Cominciamo dal C#.

Ho due classi, impiegato e scolaro ambedue delle quali hanno la funzione scrivi().
Ognuno esegue la funzione:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Impiegato
    {
        public void scrivi()
        {
            Console.WriteLine("io scrivo i documenti");
            Console.ReadLine();
        }

        public void relaziona()
        {
            Console.WriteLine("io relaziono sui documenti");
            Console.ReadLine();
        }
    }

    class Scolaro
    {
        public void scrivi()
        {
            Console.WriteLine("io scrivo i compiti sul quaderno");
            Console.ReadLine();
        }
        public void calcola()
        {
            Console.WriteLine("io faccio i calcoli per i problemi di matematica");
            Console.ReadLine();
        }
    }


    class Program
    {


        static void Main(string[] args)
        {
            Impiegato Mario = new Impiegato();
            Scolaro Pierino = new Scolaro();

            Mario.scrivi();
            Pierino.scrivi();
            

        }
    }
}
io scrivo i documenti

io scrivo i compiti sul quaderno



Adesso mi serve una funzione in cui si scriva: posso chiamare sia uno scolaro che un impiegato: ambedue implementano l'interfaccia IScrivente
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Impiegato:IScrivente
    {
        public void scrivi()
        {
            Console.WriteLine("io scrivo i documenti");
            Console.ReadLine();
        }

        public void relaziona()
        {
            Console.WriteLine("io relaziono sui documenti");
            Console.ReadLine();
        }
    }

    class Scolaro:IScrivente
    {
        public void scrivi()
        {
            Console.WriteLine("io scrivo i compiti sul quaderno");
            Console.ReadLine();
        }
        public void calcola()
        {
            Console.WriteLine("io faccio i calcoli per i problemi di matematica");
            Console.ReadLine();
        }
    }

    interface IScrivente
    {
        void scrivi();
    }
    class Program
    {
        static void serveScrittura(IScrivente x)
        {
            x.scrivi();
        }

        static void Main(string[] args)
        {
            Impiegato Mario = new Impiegato();
            Scolaro Pierino = new Scolaro();

            serveScrittura(Mario);
            serveScrittura(Pierino);
            

        }
    }
}
io scrivo i documenti

io scrivo i compiti sul quaderno


Ecco. Sia Impiegato che Scolaro implementano l'interfaccia IScrivente. L'unica cosa notevole da ricordare è che la sintassi in C# per implementare l'interfaccia è uguale a quella di rendere una classe derivata di un'altra.


Ma questo lavoro non si può fare con le classi astratte?
Proviamo...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    abstract class Scrivente
    {
        public abstract void scrivi();
    }

    class Impiegato:Scrivente
    {
        public override void scrivi()
        {
            Console.WriteLine("io scrivo i documenti");
            Console.ReadLine();
        }

        public void relaziona()
        {
            Console.WriteLine("io relaziono sui documenti");
            Console.ReadLine();
        }
    }

    class Scolaro:Scrivente
    {
        public override void scrivi()
        {
            Console.WriteLine("io scrivo i compiti sul quaderno");
            Console.ReadLine();
        }
        public void calcola()
        {
            Console.WriteLine("io faccio i calcoli per i problemi di matematica");
            Console.ReadLine();
        }
    }

    
    class Program
    {
        static void serveScrittura(Scrivente x)
        {
            x.scrivi();
        }

        static void Main(string[] args)
        {
            Impiegato Mario = new Impiegato();
            Scolaro Pierino = new Scolaro();

            serveScrittura(Mario);
            serveScrittura(Pierino);
            

        }
    }
}
io scrivo i documenti

io scrivo i compiti sul quaderno


Certo che si può.
Ma può capitare che una classe implementi più di una interfaccia, e dal momento che in C# non esiste l'ereditarietà multipla come in C++, è conveniente usare le interfacce.
E poi con le classi astratte si possono passare anche metodi già implementati, cosa che non si può fare con le interfacce.

Nessun commento:

Posta un commento