sabato 6 settembre 2014

Metodi virtuali nei 4 linguaggi.

Adesso anche l'apprendista vuole essere chiamato Cuoco perché si sente un Cuoco a tutti gli effetti.

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