web-dev-qa-db-ja.com

抽象クラスでジェネリックを使用する

私は、実装クラスがTのリストを実装する必要がある抽象クラスに取り組んでいます。問題は、これが機能しないことです。

public class AbstractClass
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass
{
    public List<Widgets> Items { get; set; }
}

私は欠けている明白な答えがあると確信しています、そしてリストに入れるための抽象的な基本型を構築できることを知っていますが、Linqコマンドを使用してリストを構築すると、抽象的な型(ItemBase )は.ToList()メソッドではうまく機能しません。私がやろうとしていることはとてもユニークなことですか?

23
thaBadDawg

Tのタイプを知るには、クラスでの宣言も必要です。

public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public List<Widgets> Items { get; set; }
}

IWidgetsを実装する必要があると言うように、Tが何であるかを制限することもできます。

public class AbstractClass<T> where T : IWidgets
35
Nick Craver
  • タイプTを宣言する必要があります。
  • クラスAbstractClassを抽象クラスとして宣言する必要があります。
  • Overrideキーワードを使用する必要があります。

これを試して:

public class Widgets { }

public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public override List<Widgets> Items { get; set; }
}
9
Mark Byers

AbstractClassをジェネリックにする必要があります

public class AbstractClass<T> {
  ...
}

public class Container : AbstractClass<Widgets> { ...
}
6
JaredPar
  1. AbstractClass abstractをマークする必要があります。これは、抽象プロパティが含まれているためです。

  2. AbstractClass宣言でgeneric typeを指定します

  3. overrideで抽象プロパティを実装する


public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public override List<Widgets> Items { get; set; }
}
3

あなたはそのようにTを定義する必要があります

public class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widget>
{
    public List<Widgets> Items { get; set; }
}
2
JDMX

抽象クラスでタイプを指定する必要があります:

public class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public List<Widgets> Items { get; set; }
}
1
Reed Copsey

AbstractClassクラスの抽象キーワードを定義していないため、コンテナクラスアイテムプロパティにオーバーライドキーワードを追加する必要があります。私は確かに実行されるサンプルコードを与えています。

namespace AbstractGeneric
{

public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Widgets
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public override List<Widgets> Items { get; set; }
    public Container()
    {
        Items = new List<Widgets>();
    }

}


class Program
{
    static void Main(string[] args)
    {
        Container c = new Container();
        c.Items.Add(new Widgets() { ID = 1, Name = "Sample Widget 1" });
        c.Items.Add(new Widgets() { ID = 2, Name = "Sample Widget 2" });

        foreach (Widgets item in c.Items)
        {
            Console.WriteLine(item.ID + " : " + item.Name);
        }

        Console.ReadLine();
    }
}
}
0
Humayoun Kabir