【问题标题】:C# Property Access vs Interface ImplementationC# 属性访问与接口实现
【发布时间】: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 对象尽可能易于使用。所以我的选择是:

  1. PivotCollection 实现IList&lt;PivotItem&gt; 并拥有FacetCategory 的访问器方法:在这种情况下,可以通过编写foo.Add(bar) 向集合foo 添加一个项目。这是可行的,但由于 Collection 是两种列表,因此只能作为一种类型(类别或项目)的列表传递,这似乎是一个低于标准的解决方案。

  2. ListCategoryListItemList)创建嵌套包装类。这具有制作一致接口的优点,但缺点是这些属性将不再能够用作列表(因为我需要重写非虚拟 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&lt;PivotItem&gt;并拥有一个属性FacetCategories

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

【问题讨论】:

  • 你不应该创建一个名为Collection的类。选择一个更具体的名称。
  • 编辑为PivotCollection - 会更好吗?
  • 由于它不是(直接)对象的集合,它可能不应该以 Collection 结尾。
  • 名称来自CXML spec:每个类都映射到一个对应的XML实体——PivotItemFacetCategoryFacet

标签: c# inheritance collections


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2018-08-21
    相关资源
    最近更新 更多