sabato 6 settembre 2014

Comparazione in 4 linguaggi dell'overloading di un metodo ereditato.

Oggi il maestro Cuoco è ammalato, e al ristorante c'è solo l'Apprendista, che è ormai abituato a cucinare solo ed esclusivamente pasta a due condimenti.
I clienti apprezzano tutti, anche quelli che a volte preferivano soltanto un semplice piatto di pasta col sugo o pasta col pesto, sapendo che c'è solo l'Apprendista e che lui dà il meglio di sé coi piatti di pasta a due condimenti, si adeguano e ordinano tutti pasta a due condimenti.

Senonché arriva l'anziano sig. Sclerosetti, il quale è un tradizionalista inguaribile, e, abituato a mangiare sempre e solo pasta a un condimento solo, esige che l'Apprendista gli prepari un piatto di pasta col ragù e basta!

L'apprendista si dà da fare, e vediamo che succede nei quattro linguaggi:

In C++:
#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, char * condimento2){
  cout << "io cucino pasta con " << condimento << " e " << condimento2 << endl;
  getchar();
 }
};

void main(){

 Apprendista * Antonio = new Apprendista();


 Antonio->Pasta("ragu");
}
1>c:\users\antonello\documents\visual studio 2010\projects\test15\test15\foglio1.cpp(25): error C2660: 'Apprendista::Pasta': la funzione non accetta 1 argomenti




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 Sub Pasta(condimento As String, condimento2 As String)
            Console.WriteLine("io cucino pasta con " & condimento & " e " & condimento2)
            Console.ReadLine()
        End Sub
    End Class

    Sub Main()

        Dim Antonio As New Apprendista

        Antonio.Pasta("ragu")
    End Sub

End Module
Errore 2 Argomento non specificato per il parametro 'condimento2' di 'Public Sub Pasta(condimento As String, condimento2 As String)'. C:\Users\Antonello\AppData\Local\Temporary Projects\ConsoleApplication1\Module1.vb 21 9 ConsoleApplication1




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, string condimento2)
        {
            Console.WriteLine("io cucino la pasta con " + condimento + " e " + condimento2);
            Console.ReadLine();
        }
    }



    
    class Program
    {
        static void Main(string[] args)
        {

            Apprendista Antonio = new Apprendista();

            Antonio.Pasta("ragu");
        }
    }
}
io cucino la pasta con ragu




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, String condimento2){
        System.out.println("io cucino pasta con " + condimento + " e "+ condimento2);
    }
}

public class JavaApplication1 {


    
    public static void main(String[] args) {

        Apprendista Antonio=new Apprendista();

        Antonio.Pasta("ragu");

    }
}
run:
io cucino pasta con ragu
BUILD SUCCESSFUL (total time: 0 seconds)



Ecco: abbiamo messaggi di errore in C++ e in VB.NET.
In C++ avevo risolto ridichiarando il metodo ereditato nella classe derivata.
Ma vediamo se esiste qualche altro modo...

Ecco: ho trovato un altro modo: mettere nella classe derivata un using Base::metodo;.
In VB.NET, invece, bisogna mettere nell'altro metodo la parola chiave Overloads a indicare che il metodo viene overloadato e non overridato... (anche se forse questa non è la parola giusta).

Facciamo la comparazione fra C++ e VB.NET:

In C++:
#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:
 using Cuoco::Pasta;
 void Pasta(char * condimento, char * condimento2){
  cout << "io cucino pasta con " << condimento << " e " << condimento2 << endl;
  getchar();
 }
};

void main(){

 Apprendista * Antonio = new Apprendista();


 Antonio->Pasta("ragu");
}
io cucino pasta con ragu




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, condimento2 As String)
            Console.WriteLine("io cucino pasta con " & condimento & " e " & condimento2)
            Console.ReadLine()
        End Sub
    End Class

    Sub Main()

        Dim Antonio As New Apprendista

        Antonio.Pasta("ragu")
    End Sub

End Module
io cucino pasta con ragu



In C# e in Java l'overload è implicito.

Nessun commento:

Posta un commento