he estado ocupado con C# 4.0 genéricos, y ahora básicamente quiero hacer algo como esto: clase TreeC# - ¿Hay alguna forma de lanzar una colección genérica?
public abstract class GenericTree<T> : Tree
where T : Fruit
{
public Tree(IFruitCollection<T> fruits)
: base(fruits) { }
}
La base es el siguiente:
public abstract class Tree
{
private IFruitCollection<Fruit> fruits;
public IFruitCollection<Fruit> GetFruits
{
get { return fruits; }
}
public Tree(IFruitCollection<Fruit> fruits)
{
this.fruits = fruits;
}
}
Aquí está mi primer problema . El constructor de GenericTree no puede convertir la colección genérica en una colección de frutas. También tengo una implementación de GenericTree:
public class AppleTree : GenericTree<Apple>
{
public AppleTree()
: base(new FruitCollection<Apple>) { }
}
Aquí está mi segundo problema. Cuando agrego fruta a una instancia de AppleTree, utilizando myAppleTree.GetFruits.Add (...), no estoy restringido solo a las manzanas. Puedo agregar todo tipo de fruta. No quiero esto
Me trataron de resolver ese problema mediante la adición de esto a la GenericTree:
new public IFruitCollection<T> GetFruits
{
get { return base.GetFruits as IFruitCollection<T>; }
}
Pero esto no es posible tampoco. De alguna manera, siempre devuelve nulo. Podría ser posible que esto se resuelva, cuando se resuelva mi primer problema.
interfaz El IFruitCollection se ve así:
public interface IFruitCollection<T> : ICollection<T>
where T : Fruit { ... }
Y la clase FruitCollection es una implementación sencilla de la clase de colección. Ah, y por supuesto, la clase Apple extiende la clase Fruit.
La solución es hacer que la interfaz IFruitCollection sea compatible con la covarianza y la contravarianza. ¿Pero cómo logro esto? Las palabras clave del parámetro "in" o "out" no son posibles porque la interfaz ICollection no lo permite.
¡Muchas gracias por su ayuda!
Tenga en cuenta que esto puede ser fácilmente resuelto mediante la fusión del árbol y la clase GenericTree en una sola. Pero recuerda que esto es solo un ejemplo de cuál es mi problema. Mi propia aplicación es un poco más compleja. –
Como implica, la solución es hacer Tree genérico. También implica que esto no es posible. Por qué no? – phoog
En algún momento, necesito una lista de árboles. Y una lista de Tree no lo hace, porque no me permite agregar instancias de árbol . Por supuesto, indicará que no existe una referencia implícita entre Tree y Tree . –