2013-06-26 2 views
1

Я наткнулся на следующее использование Inheriting from Generic Collection.Inheriting T from from Collection <T>

class Model : Collection<Model> 
{ 
    public string Name { get; set; } 
    public string Password { get; set; } 
} 

И он может быть реализован как:

var model = new Model {Name = "Name1", Password = "Pass1"}; 
model.Add(new Model { Name = "Name2", Password = "Pass2" }); 
model.Add(new Model { Name = "Name3", Password = "Pass3" }); 

И я могу получить доступ к model как в единственном экземпляре, а также объект коллекции.

Console.Out.WriteLine("Original: " + model.Name + " : " + model.Password + Environment.NewLine); 

foreach (var m in model) 
{ 
    Console.Out.WriteLine(m.Name + " : " + m.Password + Environment.NewLine); 
} 

Как это возможно, и что на самом деле происходит под обложками?

Edit: Для дальнейшего уточнения, model имеет единственный экземпляр, отдельный, где я могу получить доступ к model.Name (Name1), а не часть коллекции, где я могу получить доступ model[0].Name (Имя2). Эта двойственная природа меня смущает.

+2

Почему это не должно быть возможно? Это в значительной степени просто делает Collection > с некоторыми дополнительными колокольчиками и свистами. – AlliterativeAlice

+1

Я не уверен, что вы спрашиваете здесь. Последний блок кода (где вы имеете в виду «единственный экземпляр, а также объект коллекции», просто выполняет итерацию каждого элемента в коллекции через цикл foreach, другими словами, он выполняет итерацию через коллекцию 'model' , присваивая каждому элементу в коллекции переменную 'm' и доступ к этой переменной' m'. Здесь нет «обоих», и в любом из вашего опубликованного кода ничего не происходит «под обложками» (я не downvote - ваше qeustion просто неясно, и я прошу вас [изменить], чтобы уточнить, о чем вы нас спрашиваете.) –

+0

Ничего странного в этом коде, кроме того, что это потенциально запутанно. –

ответ

2

О

class Model : Collection<Model> 

сначала я хотел бы отметить, что это не выглядит как очень хорошая идея.

Но это не так запутанно, как кажется. Не существует циклического наследования, просто обратная ссылка на тип Model.

Немного более вменяемая версия:

class Model 
{ 
    public List<Model> SubModels { get; set; } 
} 

List<> Здесь также содержит тип, который еще полностью не определен.

+0

Предположительно, в «Модели» помимо «SubModels» были бы другие свойства. В противном случае это всего лишь черепахи. –