Guida programmazione orientata agli oggetti » Torna alla lezione

Esempio di ereditarietà [Javascript]

Il linguaggio Javascript supporta il concetto di ereditarietà attraverso l'uso dei prototipi (objects prototypes). Un prototipo rappresenta una sorta di template in cui vengono definiti un insieme di proprietà e metodi che si desidera vengano condivise da tutte le istanze di un determinato tipo di oggetto. Ogni tipo di oggetto, in Javascript, ha una proprietà prototype che è possibile estendere o ereditare.

Nell'esempio seguente viene utilizzato un object prototype FiguraGeometrica che definisce due metodi ( GetArea() e Disegna() ) facenti capo, rispettivamente, ai metodi FiguraGeometrica_GetArea() e FiguraGeometrica_Disegna(). Gli object prototype Cerchio e Rettangolo (aventi il rispettivo prototype definito come una istanza di FiguraGeometrica) erediteranno tali metodi effettuando, però, l'override del metodo Disegna(),ridefinito in maniera opportuna per ciascun oggetto:

FiguraGeometrica.prototype.GetArea = FiguraGeometrica_GetArea;
FiguraGeometrica.prototype.Disegna = FiguraGeometrica_Disegna;

function FiguraGeometrica ()
{
}
function FiguraGeometrica_GetArea()
{
    return this.area;
}
function FiguraGeometrica_Disegna()
{
    alert( "Metodo Disegna della classe FiguraGeometrica" );
}

Cerchio.prototype = new FiguraGeometrica();
Cerchio.prototype.constructor = Cerchio;
Cerchio.prototype.baseClass = FiguraGeometrica.prototype.constructor;
Cerchio.prototype.Disegna = Cerchio_Disegna;

function Cerchio(r)
{
    this.area = Math.PI * r * r;
}

function Cerchio_Disegna()
{
    alert("Metodo Disegna della classe Cerchio");
}

Rettangolo.prototype = new FiguraGeometrica();
Rettangolo.prototype.constructor = Rettangolo;
Rettangolo.prototype.baseClass = FiguraGeometrica.prototype.constructor;
Rettangolo.prototype.Disegna = Rettangolo_Disegna;

function Rettangolo(x, y)
{
    this.area = x * y;
}

function Rettangolo_Disegna()
{
    alert("Metodo Disegna della classe Rettangolo");
}

// Vengono quindi costruiti due oggetti, rispettivamente
// di classe Cerchio e Rettangolo ed invocati i metodi "overridati"
// Disegna oltre al metodo GetArea, definito nella classe padre
var circle = new Cerchio( 5 );
var rectangle = new Rettangolo(10, 20);
alert( "Classe padre della classe Cerchio = " + circle.baseClass);
alert( "Area del Cerchio = " + circle.GetArea() );
circle.Disegna();
alert( "Classe padre della classe Rettangolo = " + rectangle.baseClass);
alert( "Area del Rettangolo = " + rectangle.GetArea() );
rectangle.Disegna();