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 quadernoEcco. 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 quadernoCerto 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