8 Eylül 2016 Perşembe

ICloneable Arayüzü

Clone metodu
İmzası şöyledir.
object ICloneable.Clone();
Şöyle yaparız.
public class Foo : ICloneable
{

  object ICloneable.Clone()
  {
    ...
  }
}
Ancak Clone metodunun object dönmesi hoş değil. O yüzden nesnenin kendi tipini dönmek için şöyle yaparız.
public class Foo : ICloneable
{
   public Tuple<string, string> pair { get; set; }
   public double Signal { get; set; }
   public double SigmaMove { get; set; }
   public DateTime Date { get; set; }

   public Foo (Foo right)
   {
      pair      = right.pair;      Signal    = right.Signal ;      SigmaMove = right.SigmaMove;      Date      = right.Date;   }           

   #region ICloneable Members
   public Information Clone () { return new Information(this); }
   object ICloneable.Clone ()
   {
      return Clone();
   }
   #endregion
}
Primitive Alanlar İçin
MemberwiseClone() kullanılır. Eğer sınıfın sadece primitive alanlardan oluşuyorsa şöyle yaparız.
public class Vehicle : ICloneable
{
  public int VehicleId { get; set; }
  public double IdleVolume
  ... 
  public object Clone()
  {
    return this.MemberwiseClone();
  }
}
Reference Alanlar İçin
Eğer sınıf içinde List,Dictionary gibi alanlar varsa bu alanları kodla çoklamak gerekir. Şöyle yaparız.
public object Clone()
{
  Foo clone = this.MemberwiseClone();
  List<Order> clonedOrders = new List<Order>();
  foreach (Order order in this.FilledOrders)
    clonedOrders.Add((Order)order.Clone());
  clone.FilledOrders = clonedOrders;
  return clone;
}




Hiç yorum yok:

Yorum Gönder