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