Dunque ricostruiamo la funzione che chiama ambedue con lo stesso nome, rispettando però il diverso modo di lavorare dell'apprendista.
#include "iostream" using namespace std; class Cuoco{ public: void Pasta(char * condimento){ cout << "io cucino pasta con " << condimento << endl; getchar(); } }; class Apprendista: public Cuoco{ public: void Pasta(char * condimento){ cout << "io cucino nella pentola a pressione pasta con " << condimento << endl; getchar(); } void Pasta(char * condimento, char * condimento2){ cout << "io cucino pasta con " << condimento << " e " << condimento2 << endl; getchar(); } }; void chiama(Cuoco * x){ x->Pasta("sugo"); } void main(){ Cuoco * Mario = new Cuoco(); Apprendista * Antonio=new Apprendista(); chiama(Mario); chiama(Antonio); }
io cucino pasta con sugo io cucino pasta con sugo
In VB:
Module Module1 Class Cuoco Public Sub Pasta(condimento As String) Console.WriteLine("io cucino pasta con " & condimento) Console.ReadLine() End Sub End Class Class Apprendista Inherits Cuoco Public Overloads Sub Pasta(condimento As String) Console.WriteLine("io cucino nella pentola a pressione pasta con " & condimento) Console.ReadLine() End Sub Public Overloads Sub Pasta(condimento As String, condimento2 As String) Console.WriteLine("io cucino pasta con " & condimento & " e " & condimento2) Console.ReadLine() End Sub End Class Sub chiama(x As Cuoco) x.Pasta("sugo") End Sub Sub Main() Dim Mario As New Cuoco Dim Antonio As New Apprendista chiama(Mario) chiama(Antonio) End Sub End Module
io cucino pasta con sugo io cucino pasta con sugo
in C#:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Cuoco { public void Pasta(string condimento) { Console.WriteLine("io cucino la pasta con " + condimento); Console.ReadLine(); } } class Apprendista : Cuoco { public void Pasta(string condimento) { Console.WriteLine("io cucino nella pentola a pressione pasta con " + condimento); Console.ReadLine(); } public void Pasta(string condimento, string condimento2) { Console.WriteLine("io cucino la pasta con " + condimento + " e " + condimento2); Console.ReadLine(); } } class Program { static void chiama(Cuoco x) { x.Pasta("sugo"); } static void Main(string[] args) { Cuoco Mario = new Cuoco(); Apprendista Antonio = new Apprendista(); chiama(Mario); chiama(Antonio); } } }
io cucino la pasta con sugo io cucino la pasta con sugo
in Java:
package javaapplication1; class Cuoco{ public void Pasta(String condimento){ System.out.println("io cucino pasta con " + condimento); } } class Apprendista extends Cuoco{ public void Pasta(String condimento){ System.out.println("io cucino nella pentola a pressione pasta con "+ condimento); } public void Pasta(String condimento, String condimento2){ System.out.println("io cucino pasta con " + condimento + " e "+ condimento2); } } public class JavaApplication1 { static void chiama(Cuoco x){ x.Pasta("sugo"); } public static void main(String[] args) { Cuoco Mario=new Cuoco(); Apprendista Antonio=new Apprendista(); chiama(Mario); chiama(Antonio); } }
run: io cucino pasta con sugo io cucino nella pentola a pressione pasta con sugo BUILD SUCCESSFUL (total time: 0 seconds)
Bene.
Tranne che in Java, in tutti gli altri linguaggi il vecchio Maestro chiama Cuoco l'apprendista ma lo obbliga a usare i suoi metodi, ossia cucinare senza la pentola a pressione!
Poi si arrende, e scende a più miti consigli, ma per farlo sono necessari i metodi virtuali:
In C++:
#include "iostream"
using namespace std;
class Cuoco{
public:
virtual void Pasta(char * condimento){
cout << "io cucino pasta con " << condimento << endl;
getchar();
}
};
class Apprendista: public Cuoco{
public:
void Pasta(char * condimento){
cout << "io cucino nella pentola a pressione pasta con " << condimento << endl;
getchar();
}
void Pasta(char * condimento, char * condimento2){
cout << "io cucino pasta con " << condimento << " e " << condimento2 << endl;
getchar();
}
};
void chiama(Cuoco * x){
x->Pasta("sugo");
}
void main(){
Cuoco * Mario = new Cuoco();
Apprendista * Antonio=new Apprendista();
chiama(Mario);
chiama(Antonio);
}
io cucino pasta con sugo io cucino nella pentola a pressione pasta con sugo
in VB:
Module Module1 Class Cuoco Public Overridable Sub Pasta(condimento As String) Console.WriteLine("io cucino pasta con " & condimento) Console.ReadLine() End Sub End Class Class Apprendista Inherits Cuoco Public Overrides Sub Pasta(condimento As String) Console.WriteLine("io cucino nella pentola a pressione pasta con " & condimento) Console.ReadLine() End Sub Public Overloads Sub Pasta(condimento As String, condimento2 As String) Console.WriteLine("io cucino pasta con " & condimento & " e " & condimento2) Console.ReadLine() End Sub End Class Sub chiama(x As Cuoco) x.Pasta("sugo") End Sub Sub Main() Dim Mario As New Cuoco Dim Antonio As New Apprendista chiama(Mario) chiama(Antonio) End Sub End Module
io cucino pasta con sugo io cucino nella pentola a pressione pasta con sugo
in C#:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Cuoco { public virtual void Pasta(string condimento) { Console.WriteLine("io cucino la pasta con " + condimento); Console.ReadLine(); } } class Apprendista : Cuoco { public override void Pasta(string condimento) { Console.WriteLine("io cucino nella pentola a pressione pasta con " + condimento); Console.ReadLine(); } public void Pasta(string condimento, string condimento2) { Console.WriteLine("io cucino la pasta con " + condimento + " e " + condimento2); Console.ReadLine(); } } class Program { static void chiama(Cuoco x) { x.Pasta("sugo"); } static void Main(string[] args) { Cuoco Mario = new Cuoco(); Apprendista Antonio = new Apprendista(); chiama(Mario); chiama(Antonio); } } }
io cucino la pasta con sugo io cucino nella pentola a pressione pasta con sugo
in Java il problema è già risolto alla base. Mi chiedo se ci siano situazioni in cui sia necessario che il metodo della classe derivata NON overriddi quello della classe base, e in tal caso come si faccia.
Nessun commento:
Posta un commento