私は、実装クラスが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()メソッドではうまく機能しません。私がやろうとしていることはとてもユニークなことですか?
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
これを試して:
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; }
}
AbstractClass
をジェネリックにする必要があります
public class AbstractClass<T> {
...
}
public class Container : AbstractClass<Widgets> { ...
}
AbstractClass abstract
をマークする必要があります。これは、抽象プロパティが含まれているためです。
AbstractClass
宣言でgeneric typeを指定します
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; }
}
あなたはそのように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; }
}
抽象クラスでタイプを指定する必要があります:
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; }
}
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();
}
}
}