Come ti sommo le pere con le mele

Ecco la mia idiomatica soluzione per sommare le pere con le mele.

 
  abstract class Fruit{}
  
  class Fruits : Collection<Fruit> 
  {
    public Fruits() { }
  
    private Fruits(IList<Fruit> list) : base(list) { }
  
    public static Fruits operator +(Fruits a, Fruits b)
    {
      List<Fruit> list = new List<Fruit>();
      list.AddRange(a);
      list.AddRange(b);
      return new Fruits(list);
    }
  }
  
  class Apple : Fruit { }
  
  class Apples : Collection<Apple>
  {
    public static implicit operator Fruits(Apples apples)
    {
      Fruits fruits = new Fruits();
      foreach (Fruit fruit in apples) fruits.Add(fruit);
      return fruits;
    }
  }
  
  class Pear : Fruit { }
  
  class Pears : Collection<Pear>
  {
    public static implicit operator Fruits(Pears pears)
    {
      Fruits fruits = new Fruits();
      foreach (Fruit fruit in pears) fruits.Add(fruit);
      return fruits;
    }
  }  
  
  class Program
  {
    static void Main(string[] args)
    {
      Apples apples = new Apples();
      apples.Add(new Apple());
      apples.Add(new Apple());
      apples.Add(new Apple());
  
      Pears pears = new Pears();
      pears.Add(new Pear());
      pears.Add(new Pear());
  
      Fruits fruits = new Fruits();
      fruits += apples;
      fruits += pears;
  
      //... oppure ...
      //Fruits fruits = (Fruits)apples + pears;
  
      Console.WriteLine(fruits.Count);
      Console.ReadLine();
    }
   }

Mumble... soluzione interessante ma speravo di trovare qualcosa di più elegante pur rimanendo nel semplice/pulito (leggi poche righe di codice)... e ovviamente sempre prendendo come vincolo l'overload dell'operatore somma ;-p Più che altro non mi piace la ri-definizione dell'operatore di casting implicito in ogni definizione di collezione di frutta tipizzata (Apples, Pears ...)

posted @ mercoledì 3 maggio 2006 03:06

Print

Comments on this entry:

# re: Come ti sommo le pere con le mele

Left by Massimo Prota at 03/05/2006 17:44
Gravatar
Ne avevo la necessità in un caso reale e la soluzione che avevo pensato era molto simile a quella che hai illustrato, ma l'ho valutata troppo "costosa" e quindi alla fine non l'ho inserita nel progetto.
Sarebbe bello potersela giocare con le interfacce per avere una conversione flessibile e poco vincolante, ma purtroppo non è possibile senza cadere nel compiler error CS0552.
IMHO un problema abbastanza comune visto che ne parlano anche le specifiche C# al paragrafo 20.5.6 (non fornendo però una soluzione) quindi se prosegui e scopri qualcosa di interessante faccelo sapere ;)
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011