Visualizzazione post con etichetta Java. Mostra tutti i post
Visualizzazione post con etichetta Java. Mostra tutti i post

venerdì 7 novembre 2014

Il programma di mio figlio Daniele

Daniele sta costruendo un programma in Java.
Ecco il codice:
package supercraftdemo;

import java.applet.*;

public class Component extends Applet implements runnable{
    private static final long serialVersionUID = 1L;
    private static int pixelSize = 2;
    public static Dimension size = new Dimension(700,560);
    public static Dimension pixel = new Dimension(size.width / pixelSize, size.height / pixelSize);
    
    public static String name = "supercraft";
    
    public static boolean isRunning = false;
    
    private image screen;
    
    public static Level level;
    
 public Component(){
     setPreferedSize(size);
     

 }

 public void start(){
  //definire oggetti
  level = new Level();
  
  //inizio loop del gioco
  isrunning = true;
  new trhead(this).start();
 }
 
 public void stop (){
  isRunning = false;
 }
 
 public static void main(String args []) {
               Component  component = new Component();
               
               JFrame = new JFrame();
}

domenica 7 settembre 2014

Classi astratte comparate nei quattro linguaggi

Andiamo dunque all'eventualità in cui il maestro Cuoco non lavori più.
Egli non è più disponibile per essere istanziato, ossia per svolgere turni al ristorante, ma continua a dirigere il ristorante stesso.
Egli lascia completa libertà su tutto, ma esige che chi lavora per lui faccia il pollo col rosmarino e non in modo diverso.

In C++:
#include "iostream"
using namespace std;

class Cuoco{

public:
	void Pollo(){
		cout << "io cucino il pollo con rosmarino" << endl;
		getchar();
	}
	virtual void Pasta(char * condimento)=0;
};

class Apprendista: public Cuoco{
	
public:
	void Pasta(char * condimento){
		cout << "io cucino con la pentola a pressione pasta e " << condimento << endl;
		getchar();
	}
	void Pasta(char * condimento, char * condimento2){
		cout << "io cucino con la pentola a pressione pasta e " << condimento << " e " << condimento2 << endl;
		getchar();
	}
};


class Apprendista2: public Cuoco{
public:
	void Pasta(char * condimento){
		cout << "io cucino col forno a legna pasta e " << condimento << endl;
		getchar();
	}
		void Pasta(char * condimento, char * condimento2){
		cout << "io cucino con la pentola a pressione pasta e " << condimento << " e " << condimento2 << endl;
		getchar();
	}
};


void main(){
	Apprendista * Antonio=new Apprendista();
	Apprendista2 * Giuseppe=new Apprendista2();

	Antonio->Pasta("sugo");
	Antonio->Pasta("tonno", "formaggio");
	Antonio->Pollo();

	Giuseppe->Pasta("sugo");
	Giuseppe->Pasta("aglio", "olio");
	Giuseppe->Pollo();

	
}
io cucino con la pentola a pressione pasta e sugo

io cucino con la pentola a pressione pasta e tonno e formaggio

io cucino il pollo con rosmarino

io cucino col forno a legna pasta e sugo

io cucino con la pentola a pressione pasta e aglio e olio

io cucino il pollo con rosmarino




In VB:
Module Module1
    MustInherit Class Cuoco
        Public Sub Pollo()
            Console.WriteLine("io cucino il pollo col rosmarino")
            Console.ReadLine()
        End Sub
        Public MustOverride Sub Pasta(condimento As String)
    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 nella pentola a pressione pasta con " & condimento & " e " & condimento2)
            Console.ReadLine()
        End Sub
    End Class

    Class Apprendista2
        Inherits Cuoco
        Public Overrides Sub Pasta(condimento As String)
            Console.WriteLine("io cucino col forno a legna a pressione pasta con " & condimento)
            Console.ReadLine()

        End Sub
        Public Overloads Sub Pasta(condimento As String, condimento2 As String)
            Console.WriteLine("io cucino col forno a legna pasta con " & condimento & " e " & condimento2)
            Console.ReadLine()
        End Sub
    End Class


    Sub Main()
        Dim Antonio As New Apprendista
        Dim Giuseppe As New Apprendista2

        Antonio.Pasta("sugo")
        Antonio.Pasta("tonno", "formaggio")
        Antonio.Pollo()

        Giuseppe.Pasta("sugo")
        Giuseppe.Pasta("aglio", "olio")
        Giuseppe.Pollo()


    End Sub

End Module
io cucino nella pentola a pressione pasta con sugo

io cucino nella pentola a pressione pasta con tonno e formaggio

io cucino il pollo col rosmarino

io cucino col forno a legna a pressione pasta con sugo

io cucino col forno a legna pasta con aglio e olio

io cucino il pollo col rosmarino





In C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{

    abstract class Cuoco
    {
        public void Pollo()
        {
            Console.WriteLine("io cucino il pollo col rosmarino");
            Console.ReadLine();
        }
        abstract public void Pasta(string condimento);
        
    }

    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 nella pentola a pressione la pasta con " + condimento + " e " + condimento2);
            Console.ReadLine();
        }
    }

    class Apprendista2 : Cuoco
    {
        public override void Pasta(string condimento)
        {
            Console.WriteLine("io cucino nel forno a legna pasta con " + condimento);
            Console.ReadLine();
        }
        public void Pasta(string condimento, string condimento2)
        {
            Console.WriteLine("io cucino nel forno a legna la pasta con " + condimento + " e " + condimento2);
            Console.ReadLine();
        }
    }



    
    class Program
    {

        static void Main(string[] args)
        {
            
            Apprendista Antonio = new Apprendista();
            Apprendista2 Giuseppe = new Apprendista2();

            Antonio.Pasta("sugo");
            Antonio.Pasta("tonno", "formaggio");
            Antonio.Pollo();

            Giuseppe.Pasta("sugo");
            Giuseppe.Pasta("aglio", "olio");
            Giuseppe.Pollo();
        }
    }
}
io cucino nella pentola a pressione pasta con sugo

io cucino nella pentola a pressione la pasta con tonno e formaggio

io cucino il pollo col rosmarino

io cucino nel forno a legna pasta con sugo

io cucino nel forno a legna la pasta con aglio e olio

io cucino il pollo col rosmarino




In Java:
package javaapplication1;

abstract class Cuoco{
    public void Pollo(){
        System.out.println("io cucino il pollo col rosmarino");
     }
    public abstract void Pasta(String 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 nella pentola a pressione pasta con " + condimento + " e "+ condimento2);
    }
}

class Apprendista2 extends Cuoco{
    public void Pasta(String condimento){
        System.out.println("io cucino nel forno a legna pasta con "+ condimento);
    }
    public void Pasta(String condimento, String condimento2){
        System.out.println("io cucino nel forno a legna pasta con " + condimento + " e "+ condimento2);
    }
}
public class JavaApplication1 {


   
    
    public static void main(String[] args) {
        Apprendista Antonio=new Apprendista();
        Apprendista2 Giuseppe=new Apprendista2();
        
        Antonio.Pasta("sugo");
        Antonio.Pasta("tonno","formaggio");
        Antonio.Pollo();
        
        Giuseppe.Pasta("sugo");
        Giuseppe.Pasta("aglio","olio");
        Giuseppe.Pollo();
        

    }
}
run:
io cucino nella pentola a pressione pasta con sugo
io cucino nella pentola a pressione pasta con tonno e formaggio
io cucino il pollo col rosmarino
io cucino nel forno a legna pasta con sugo
io cucino nel forno a legna pasta con aglio e olio
io cucino il pollo col rosmarino
BUILD SUCCESSFUL (total time: 0 seconds)
Ecco.
Adesso dobbiamo ripassarci bene overriding e overloading comparati...

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.

Overriding del metodo ereditato nei 4 linguaggi.

Adesso il nostro apprendista elabora un modo suo di cucinare, e si mette a usare la pentola a pressione.

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){
  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 main(){

 Cuoco * Mario = new Cuoco();
 Apprendista * Antonio=new Apprendista();
 Mario->Pasta("ragu");
 Antonio->Pasta("ragu");

}
io cucino pasta con ragu

io cucino nella pentola a pressione 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)
            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 Main()

        Dim Antonio As New Apprendista

        Antonio.Pasta("ragu")
    End Sub

End Module
io cucino pasta con ragu

io cucino nella pentola a pressione pasta con ragu


Ecco.
Ho dovuto ridefinire il metodo in C++, e anche in VB.NET.
Però in VB.NET ho dovuto anteporre la parola chiave Overloads anche al metodo ridefinito.

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 Main(string[] args)
        {
            Cuoco Mario = new Cuoco();
            Apprendista Antonio = new Apprendista();
            Mario.Pasta("ragu");
            Antonio.Pasta("ragu");
        }
    }
}
io cucino la pasta con ragu

io cucino nella pentola a pressione 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){
        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 {


    
    public static void main(String[] args) {
        Cuoco Mario=new Cuoco();
        Apprendista Antonio=new Apprendista();
        Mario.Pasta("ragu");
        Antonio.Pasta("ragu");

    }
}
run:
io cucino pasta con ragu
io cucino nella pentola a pressione pasta con ragu
BUILD SUCCESSFUL (total time: 1 second)


Anche qui il comportamento è simile a quello del C#.

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.

Ripasso di classi ed ereditarietà, in C++, C#, VB.NET e Java con la storiella del ristorante.

Introduciamo un po' il VB.NET.

Sempre con la scenetta del ristorante.

La vicenda era quella del cuoco che aveva un apprendista, e gli aveva trasmesso la capacità di cucinare la pasta con un condimento.
Ora l'apprendista sviluppa l'abilità di cucinare con due condimenti, che il maestro non ha.
E quindi abbiamo questa situazione:

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 Mario As New Cuoco
        Dim Antonio As New Apprendista

        Mario.Pasta("sugo")
        Antonio.Pasta("aglio", "olio")
    End Sub

End Module
io cucino pasta con sugo

io cucino pasta con aglio e olio




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)
        {
            Cuoco Mario = new Cuoco();
            Apprendista Antonio = new Apprendista();
            Mario.Pasta("sugo");
            Antonio.Pasta("aglio", "olio");
        }
    }
}
io cucino la pasta con sugo

io cucino la pasta con aglio e olio




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(){
 Cuoco * Mario = new Cuoco();
 Apprendista * Antonio = new Apprendista();

 Mario->Pasta("sugo");
 Antonio->Pasta("aglio","olio");
}
io cucino pasta con sugo

io cucino pasta con aglio e olio




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) {
        Cuoco Mario=new Cuoco();
        Apprendista Antonio=new Apprendista();
        Mario.Pasta("sugo");
        Antonio.Pasta("aglio", "olio");

    }
}
run:
io cucino pasta con sugo
io cucino pasta con aglio e olio
BUILD SUCCESSFUL (total time: 0 seconds)



Bene.
Da quando l'Apprendista ha elaborato il suo metodo di cucina con due condimenti non cucina più con un solo condimento: dal momento che i due stanno al ristorante insieme, il maestro Cuoco cucina a un condimento, mentre l'Apprendista Antonio cucina a due condimenti.

Vediamo l'ulteriore evoluzione della cosa...

martedì 2 settembre 2014

Overloading di un metodo ereditato in C++, C# e Java

Dunque se in C++ bisogna fare l'overload di un metodo ereditato, bisogna ridefinire il metodo ereditato:
#include "iostream"
using namespace std;

class Base{
public:
 void metodo(){
 cout << "Io sono il metodo della classe Base" << endl;
 getchar();
 }
};

class Derivata: public Base{
public:
 void metodo(){
  Base::metodo();
 }
 void metodo(int parametro){
 cout << "Io sono il metodo della classe Derivata" << endl;
 getchar();

 }
 
};

void main(){
 Base miaBase;
 Derivata miaDerivata;


 miaBase.metodo();
 miaDerivata.metodo();
 miaDerivata.metodo(1);
} 
Io sono il metodo della classe Base

Io sono il metodo della classe Base

Io sono il metodo della classe Derivata


Cosa non necessaria in C# e Java:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Base
    {
        public void metodo()
        {
            Console.WriteLine("Io sono il metodo della classe Base");
            Console.ReadLine();
        }
    }

    class Derivata:Base{

        public void metodo(int parametro)
        {
            Console.WriteLine("Io sono il metodo della classe derivata ");
            Console.ReadLine();

        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Base miaBase=new Base();
            Derivata miaDerivata=new Derivata();
            

            miaBase.metodo();
            miaDerivata.metodo();
            miaDerivata.metodo(1);
        }
    }
}
Io sono il metodo della classe Base

Io sono il metodo della classe Base

Io sono il metodo della classe derivata


package javaapplication1;

class Base{
    public void metodo(){
        System.out.println("Io sono il metodo della classe Base");
        
    }
}

class Derivata extends Base{
    public void metodo(int parametro){
        System.out.println("Io sono il metodo della classe Derivata");
    }
}

public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
        Base miaBase=new Base();
        Derivata miaDerivata=new Derivata();
        
        miaBase.metodo();
        miaDerivata.metodo();   
        miaDerivata.metodo(1);
    }
}
run:
Io sono il metodo della classe Base
Io sono il metodo della classe Base
Io sono il metodo della classe Derivata
BUILD SUCCESSFUL (total time: 0 seconds)

Studio comparato C++, C#, Java, sull'eredità di metodi quando vi sia un metodo con lo stesso nome ma con firma diversa

Per vedere se un metodo ereditato dalla classe base viene "occultato" da un metodo con identico nome ma con firma diversa, ho inventato un test:
Creare una classe Base con un metodo senza parametri;
Creare una classe Derivata con un metodo dallo stesso nome e firma uguale (anch'esso senza parametri), con codice diverso;
Istanziare la classe Base e la classe Derivata;
Eseguire il metodo dell'istanza di Base e dell'istanza di Derivata.

Quindi cambiare la firma aggiungendo parametri del metodo della classe derivata;
Eseguire nuovamente il metodo senza parametri sia dall'istanza di Base che dall'istanza di Derivata.
Questi sono i codici:

C++:
#include "iostream"
using namespace std;

class Base{
public:
 void metodo(){
  cout << "Io sono il metodo della classe Base" << endl;
  getchar();
 }
};

class Derivata: public Base{
public:
 void metodo(){
  cout << "Io sono il metodo della classe Derivata" << endl;
  getchar();
 }
};

void main(){
 Base miaBase;
 Derivata miaDerivata;


 miaBase.metodo();
 miaDerivata.metodo();
} 
Io sono il metodo della classe Base

Io sono il metodo della classe Derivata




C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Base
    {
        public void metodo()
        {
            Console.WriteLine("Io sono il metodo della classe Base");
            Console.ReadLine();
        }
    }

    class Derivata:Base{
        public void metodo()
        {
            Console.WriteLine("Io sono il metodo della classe derivata");
            Console.ReadLine();
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Base miaBase=new Base();
            Derivata miaDerivata=new Derivata();
            

            miaBase.metodo();
            miaDerivata.metodo();
        }
    }
}
Io sono il metodo della classe Base

Io sono il metodo della classe derivata




Java
package javaapplication1;

class Base{
    public void metodo(){
        System.out.println("Io sono il metodo della classe Base");
        
    }
}

class Derivata extends Base{
    public void metodo(){
        System.out.println("Io sono il metodo della classe Derivata");
    }
}

public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Base miaBase=new Base();
        Derivata miaDerivata=new Derivata();
        
        miaBase.metodo();
        miaDerivata.metodo();   
    }
}
run:
Io sono il metodo della classe Base
Io sono il metodo della classe Derivata
BUILD SUCCESSFUL (total time: 1 second)

Adesso, invece, mettiamo un parametro nel metodo della classe derivata (cambiamo la firma lasciando intatto il nome):

C++
public:
 void metodo(){
  cout << "Io sono il metodo della classe Base" << endl;
  getchar();
 }
};

class Derivata: public Base{
public:
 void metodo(int parametro){
  cout << "Io sono il metodo della classe Derivata" << endl;
  getchar();
 }
};

void main(){
 Base miaBase;
 Derivata miaDerivata;


 miaBase.metodo();
 miaDerivata.metodo();
}
1>------ Inizio compilazione: Progetto: test15, Configurazione: Debug Win32 ------
1>  foglio1.cpp
1>c:\users\antonello\documents\visual studio 2010\projects\test15\test15\foglio1.cpp(26): error C2660: 'Derivata::metodo': la funzione non accetta 0 argomenti
========== Compilazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========
Ecco: quando dico di eseguire il metodo metodo() dalla classe derivata, esso non risulta disponibile perché la classe derivata riconosce come unico metodo con il nome metodo quello con il parametro.

in C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Base
    {
        public void metodo()
        {
            Console.WriteLine("Io sono il metodo della classe Base");
            Console.ReadLine();
        }
    }

    class Derivata:Base{
        public void metodo(int parametro)
        {
            Console.WriteLine("Io sono il metodo della classe derivata");
            Console.ReadLine();
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Base miaBase=new Base();
            Derivata miaDerivata=new Derivata();
            

            miaBase.metodo();
            miaDerivata.metodo();
        }
    }
}
Io sono il metodo della classe Base

Io sono il metodo della classe Base


In C#, invece, quando dico di evocare il metodo metodo() dall'istanza della classe derivata, esso viene evocato: questo significa che nonostante vi sia un metodo con lo stesso nome anche se con parametri diversi, il metodo senza parametri viene comunque ereditato dalla classe derivata.

In Java
package javaapplication1;

class Base{
    public void metodo(){
        System.out.println("Io sono il metodo della classe Base");
        
    }
}

class Derivata extends Base{
    public void metodo(int parametro){
        System.out.println("Io sono il metodo della classe Derivata");
    }
}

public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Base miaBase=new Base();
        Derivata miaDerivata=new Derivata();
        
        miaBase.metodo();
        miaDerivata.metodo();   
    }
}
run:
Io sono il metodo della classe Base
Io sono il metodo della classe Base
BUILD SUCCESSFUL (total time: 0 seconds)

Anche in Java il metodo metodo() viene ereditato dalla classe Derivata, come in C#.