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