我有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);
}
}
我有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);
}
}
假設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);
的問題是,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
但它不會做我想做的,因爲籃子只能採取A類,而不是B或C – XandrUu
A,B,C應該實現Iabc接口,並且應該限制它的泛型 – baalazamon
這應該是正確的方式,但接口有6個屬性fildes,A有4個,B有4個,C有4個。如果我實現一個接口,我必須使用在該接口中聲明的全部6個屬性,知道一個方法 – XandrUu
哪個接口有6個屬性?如上例所示,只用你需要的東西創建你自己的界面。您嘗試使用哪個界面? –
我的自定義接口IBasketItem有6個屬性和類A只使用4和B使用4和C使用4,如果我只實現了4個屬性,它給了我錯誤,如「錯誤不實現接口成員」 – XandrUu