2012-11-03 96 views
0

我有3个班(ABC),并必须实现对所有类别的存储方法,所以我想用一个通用的清单像List<T> = new List<T>();,但它不会允许我使用它。声明泛型集合

我想的方法是这样的:

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

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

回答

3

假设A,B和C是你希望的项目在篮下对象来存储,你应该创建一个基类的物品,并宣布泛型集合作为基类的集合,即

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 = 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); 
+0

这应该是正确的方式,但接口有6个属性fildes,A有4个,B有4个,C有4个。如果我实现一个接口,我必须使用在该接口中声明的全部6个属性,知道一个方法 – XandrUu

+0

哪个接口有6个属性?如上例所示,只用你需要的东西创建你自己的界面。您尝试使用哪个界面? –

+0

我的自定义接口IBasketItem有6个属性和类A只使用4和B使用4和C使用4,如果我只实现了4个属性,它给了我错误,如“错误不实现接口成员” – XandrUu

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 
+0

但它不会做我想做的,因为篮子只能采取A类,而不是B或C – XandrUu

+0

A,B,C应该实现Iabc接口,并且应该限制它的泛型 – baalazamon