【发布时间】:2010-04-01 16:00:31
【问题描述】:
我正在编写一个类来表示 Pivot 集合,即 Pivot 识别的根对象。一个 Collection 有几个属性,一个 facet 类别列表(每个由一个 FacetCategory 对象表示)和一个项目列表(每个由一个 PivotItem 对象表示)。因此,一个极其简化的 Collection 内容如下:
public class PivotCollection
{
private List<FacetCategory> categories;
private List<PivotItem> items;
// other attributes
}
我不确定如何正确授予对这两个列表的访问权限。因为分面类别和项目的声明顺序对用户都是可见的,所以我不能使用集合,但该类也不应该允许重复的类别或项目。此外,我想让 Collection 对象尽可能易于使用。所以我的选择是:
让
PivotCollection实现IList<PivotItem>并拥有FacetCategory的访问器方法:在这种情况下,可以通过编写foo.Add(bar)向集合foo添加一个项目。这是可行的,但由于 Collection 是两种列表,因此只能作为一种类型(类别或项目)的列表传递,这似乎是一个低于标准的解决方案。为
List(CategoryList和ItemList)创建嵌套包装类。这具有制作一致接口的优点,但缺点是这些属性将不再能够用作列表(因为我需要重写非虚拟Add方法我必须实现IList而不是子类 @ 987654336@。隐式转换不起作用,因为这会将Add方法返回到其正常行为。
另外,由于我不知道的原因,IList 缺少 AddRange 方法...
public class PivotCollection
{
private class CategoryList: IList<FacetCategory>
{
// ...
}
private readonly CategoryList categories = new CategoryList();
private readonly ItemList items = new ItemList();
public CategoryList FacetCategories
{
get { return categories; }
set { categories.Clear(); categories.AddRange(value); }
}
public ItemList Items
{
get { return items; }
set { items.Clear(); items.AddRange(value); }
}
}
最后,第三个选项是将选项一和选项二结合起来,使PivotCollection实现IList<PivotItem>并拥有一个属性FacetCategories。
问题:这三个中哪一个最合适,为什么?
【问题讨论】:
-
你不应该创建一个名为
Collection的类。选择一个更具体的名称。 -
编辑为
PivotCollection- 会更好吗? -
由于它不是(直接)对象的集合,它可能不应该以
Collection结尾。 -
名称来自CXML spec:每个类都映射到一个对应的XML实体——
PivotItem、FacetCategory、Facet等
标签: c# inheritance collections