Ce qui suit présente une application du clonage en C#. Vous trouverez plus d'explications (selon une acception plus proche des usages en C++) dans cet article.
Le clonage est un mécanisme qui, bien qu'il puisse être mis en application sur des objets « concrets » (sans la moindre méthode polymorphique), est surtout pertinent en présence d'objets polymorphiques. Effectivement, imaginez la situation suivante :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
Forme f = CréerForme();
f.Dessiner();
// on veut dupliquer la Forme pour l'agrandir, mais sans modifier l'original!
Forme autreForme = f.Cloner();
autreForme.Hauteur = 10;
f.Dessiner(); // n'aura pas changé
autreForme.Dessiner(); // comme f, mais de hauteur 10
static Forme CréerForme() =>
new Random().Next() % 2 == 0? new Rectangle(3,5) : new Triangle(7);
abstract class Forme
{
public int Hauteur { get; set; } // hum...
public Forme(int hauteur)
{
Hauteur = hauteur;
}
protected Forme(Forme autre)
{
Hauteur = autre.Hauteur;
}
public abstract void Dessiner();
public abstract Forme Cloner();
}
class Rectangle : Forme
{
public int Largeur { get; set; }
public Rectangle(int hauteur, int largeur)
: base(hauteur)
{
Largeur = largeur;
}
protected Rectangle(Rectangle autre)
: base(autre)
{
Largeur = autre.Largeur;
}
public override void Dessiner()
{
Console.WriteLine($"Dessin de rectangle {Hauteur} x {Largeur}");
}
public override Rectangle Cloner() => new Rectangle(this);
}
class Triangle : Forme
{
public Triangle(int hauteur)
: base(hauteur)
{
}
protected Triangle(Triangle autre)
: base(autre)
{
}
public override void Dessiner()
{
Console.WriteLine($"Dessin de triangle de hauteur {Hauteur}");
}
public override Triangle Cloner() => new Triangle(this);
}
Ce cas montre bien le rôle du clonage :