2013-06-26 55 views
1

我遇到了繼承自通用集合的以下用法。繼承T 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); 
} 

這是怎麼可能的,真正發生了什麼?

編輯:爲了進一步澄清,model具有單個實例,它是獨立的,其中I可以訪問model.Name名1),而不是集合,其中我可以訪問model[0].Name名稱2)的一部分。這種雙重性質讓我感到困惑。

+2

爲什麼不能這樣做?這幾乎只是做了一些額外的花裏胡哨的收藏>。 – AlliterativeAlice

+1

我不確定你在問什麼。最後一塊代碼(你指的是單個實例和集合對象)只是通過foreach循環迭代集合中的每個項目;換句話說,它正在遍歷集合'model' ,將集合中的每個元素賦給變量'm',並訪問變量'm'。這裏沒有「both」,在你的任何發佈代碼中都沒有發生「封底」事件(我沒有downvote - 你的問題只是不清楚,我要求你[編輯]澄清你問我們的是什麼。) –

+0

代碼沒有什麼奇怪的,除了它可能令人困惑。 –

回答

2

關於

class Model : Collection<Model> 

首先我想指出,這看起來不像一個非常好的主意。

但它並不像看起來那麼令人困惑。沒有循環繼承,只是對Model類型的前向引用。

一個稍微理智的版本:

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

這裏List<>還包含尚未完全定義的類型。

+0

推測除了'SubModels'之外,'Model'中還會有其他屬性。否則,它只是烏龜一直下降。 –