0

3 つのクラス ( ABC) があり、すべてのクラスに格納メソッドを実装する必要があるため、一般的なリストを使用することを考えましたが、使用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 に答える