C#属性访问与接口实现

时间:2010-04-01 16:00:32

标签: c# inheritance collections

我正在编写一个类来表示Pivot集合,这是Pivot识别的根对象。 Collection有几个属性,一个facet类别列表(每个由FacetCategory对象表示)和一个项目列表(每个由PivotItem对象表示)。因此,极其简化的集合读取:

public class PivotCollection
{
    private List<FacetCategory> categories;
    private List<PivotItem> items;
    // other attributes
}

我不确定如何正确授予对这两个列表的访问权限。由于用户可以看到构面类别和项目的声明顺序,因此我不能使用集合,但该类也不应允许重复的类别或项目。此外,我想使Collection对象尽可能易于使用。所以我的选择是:

  1. PivotCollection实施IList<PivotItem>并拥有FacetCategory的访问权限方法:在这种情况下,可以通过编写{{1}将项目添加到集合foo }}。这是有效的,但由于集合同样是两种类型的列表,因此它只作为一种类型(类别或项目)的列表传递,似乎是一种低于标准的解决方案。

  2. foo.Add(bar)ListCategoryList)创建嵌套包装类。这样做的好处是可以建立一致的界面,但缺点是这些属性不再能够用作列表(因为我需要覆盖我必须实现的非虚拟ItemList方法Add而不是子类IList。隐式转换不起作用,因为这会将List方法返回到其正常行为。

  3. 此外,由于我无法理解的原因,Add缺少IList方法......

    AddRange

    最后,第三个选项是组合选项1和2,以便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>

    问题:这三个中哪一个最合适,为什么?

1 个答案:

答案 0 :(得分:2)

这里最好的做法是创建自己的集合类,继承System.Collections.ObjectModel.Collection<T>并覆盖InsertItem