C# – Clonage

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 :


Valid XHTML 1.0 Transitional

CSS Valide !