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;

namespace Clonage
{
   public 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 {0} x {1}", Hauteur, Largeur);
      }
      public override Forme Cloner()
      {
         return 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 {0}", Hauteur);
      }
      public override Forme Cloner()
      {
         return new Triangle(this);
      }
   }
   class Program
   {
      static Forme CréerForme()
      {
         Forme f;
         if (new Random().Next() % 2 == 0)
            f = new Rectangle(3,5);
         else
            f = new Triangle(7);
         return f;
      }
      static void Main(string[] args)
      {
         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
      }
   }
}

Ce cas montre bien le rôle du clonage :


Valid XHTML 1.0 Transitional

CSS Valide !