我有3个类(A
,B
,C
)并且必须为所有类实现存储方法,因此我认为使用像{{这样的通用列表1}}但它不允许我使用它。
我希望这个方法是这样的:
List<T> = new List<T>();
答案 0 :(得分: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);
但是,在检索项目时,您应该使用通用界面,或者您应该知道对象实际是哪种类型。 E.g:
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);
答案 1 :(得分: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