0

我有 3 个类(A, B, C),并且必须为所有类实现一个存储方法,所以我想使用一个通用列表,List<T> = new List<T>();但它不允许我使用它。

我希望方法是这样的:

class Bascket
{
   List<T> list= new List<T>();

   public void addToBasket(T value)
   {
      list.Add(value);
   }
}
4

2 回答 2

3

假设 A、B 和 C 是您希望存储在 Basket 对象中的项目,您应该创建这些项目的基类,并将泛型集合声明为基类的集合,即

public interface IBasketItem
{ 
    /* put some common properties and methods here */
    public decimal Price { get; set; }
    public string Name { get; set; }
}
public class A : IBasketItem
{ /* A fields */ }
public class B : IBasketItem
{ /* B fields */ }
public class C : IBasketItem
{ /* C fields */ }

public class Basket
{
    private List<IBasketItem> _items = new List<IBasketItem>();

    public void Add(IBasketItem item)
    {
        _items.Add(item);
    }

    public IBasketItem Get(string name)
    {
        // find and return an item
    }
}

然后,您可以使用 Basket 类来存储您的所有物品。

Basket basket = new Basket();
A item1 = new A();
B item2 = new B();
C item3 = new C();
basket.Add(item1);
basket.Add(item2);
basket.Add(item3);

但是,在取回项目时,您应该使用通用接口,或者您应该知道对象实际上是哪种类型。例如:

IBasketItem myItem = basket.Get("cheese");
Console.WriteLine(myItem.Name);
// Take care, if you can't be 100% sure of which type returned item will be
// don't cast. If you cast to a wrong type, your application will crash.
A myOtherItem = (A)basket.Get("milk");
Console.WriteLine(myOtherItem.ExpiryDate);
于 2012-11-03T22:34:26.940 回答
2

问题是T没有声明。您可以为您的类添加一个通用参数以使其工作:

class Basket<T>
{
   List<T> list= new List<T>();

   public void addToBasket(T value)
   {
      list.Add(value);
   }
}

这允许您像这样使用您的类:

var basket = new Basket<string>();
basket.addToBasket("foo"); // OK
basket.addToBasket(1); // Fail, int !== string
于 2012-11-03T22:24:57.707 回答