次のように同様に初期化できるようにクラスを定義するにはどうすればよいですかList<T>
。
List<int> list = new List<int>(){ //this part };
たとえば、このシナリオ:
Class aClass = new Class(){ new Student(), new Student()//... };
次のように同様に初期化できるようにクラスを定義するにはどうすればよいですかList<T>
。
List<int> list = new List<int>(){ //this part };
たとえば、このシナリオ:
Class aClass = new Class(){ new Student(), new Student()//... };
通常、コレクション初期化構文をに直接許可するにClass
は、などのコレクションインターフェイスを実装しますICollection<Student>
(たとえば、から継承することによりCollection<Student>
)。
ただし、技術的には、非汎用IEnumerable
インターフェイスを実装し、互換性のあるAdd
メソッドを使用するだけで済みます。
したがって、これで十分です。
using System.Collections;
public class Class : IEnumerable
{
// This method needn't implement any collection-interface method.
public void Add(Student student) { ... }
IEnumerator IEnumerable.GetEnumerator() { ... }
}
使用法:
Class aClass = new Class { new Student(), new Student() };
ご想像のとおり、コンパイラによって生成されるコードは次のようになります。
Class temp = new Class();
temp.Add(new Student());
temp.Add(new Student());
Class aClass = temp;
詳細については、言語仕様の「7.6.10.3コレクション初期化子」のセクションを参照してください。
MyClass
学生の集まりとして定義する場合:
public class MyClass : List<Student>
{
}
var aClass = new MyClass{ new Student(), new Student()//... }
または、クラスに次のパブリックコレクションが含まれている場合Student
:
public class MyClass
{
public List<Student> Students { get; set;}
}
var aClass = new MyClass{ Students = new List<Student>
{ new Student(), new Student()//... }}
どちらを選択するかは、クラスのモデル化方法によって異なります。
ジェネリックスの実装を提案している人は誰もいなかったので、ここにあります。
class Class<T> : IEnumerable
{
private List<T> list;
public Class()
{
list = new List<T>();
}
public void Add(T d)
{
list.Add(d);
}
public IEnumerator GetEnumerator()
{
return list.GetEnumerator();
}
}
と使用:
Class<int> s = new Class<int>() {1,2,3,4};