从班级继承价值的最佳做法?

时间:2014-03-09 22:30:22

标签: c#

我想创建一个像这样的collectionbase类构造:

在所有项目中达到(int NeedThisValue)的最佳做法是什么,这个类添加了什么?

public class SDataCollection : CollectionBase
{
    public SDataCollection()
    {
    }

    #region Properties
    /// <summary>
    /// Gets/Sets value for the item by that index
    /// </summary>
    public SData this[int index]
    {
        get
        {
            return (SData)this.List[index];
        }
        set
        {
            this.List[index] = value;
        }
    }

    public int NeedThisValue { get; private set; }

    #endregion

    #region Public Methods

    public int IndexOf(SData sDataItem)
    {
        if (sDataItem != null)
        {
            return base.List.IndexOf(sDataItem);
        }
        return -1;
    }

    public int Add(SData sDataItem)
    {
        if (sDataItem != null)
        {
            return this.List.Add(sDataItem);
        }
        return -1;
    }

    public void Remove(SData sDataItem)
    {
        this.InnerList.Remove(sDataItem);
    }

    public void AddRange(SDataCollection collection)
    {
        if (collection != null)
        {
            this.InnerList.AddRange(collection);
        }
    }

    public void Insert(int index, SData sDataItem)
    {
        if (index <= List.Count && sDataItem != null)
        {
            this.List.Insert(index, sDataItem);
        }
    }

    public bool Contains(SData sDataItem)
    {
        return this.List.Contains(sDataItem);
    }

    #endregion
}

3 个答案:

答案 0 :(得分:1)

如果您希望仅通过SDataCollection的子类访问该属性,请使用访问修饰符

  

保护

如果您希望所有其他类访问该属性,请使用访问修饰符

  

公共

如果您不希望除SDataCollection之外的任何内容访问该属性,请使用

  

私有

这是 C#面向对象101。

答案 1 :(得分:0)

我假设您要从所有CData项访问相应NeedThisValue属性的值。 通常在这些情况下,我会在每个项目上设置父项的引用。 在CData课上,你可以创建一个属性:

internal SDataCollection Parent { get; set; }

然后你通过重写OnInsert / OnRemove / OnSet / OnClear来设置/取消设置Parent。您必须检查该项目是否仅由一个集合附加。

在任何情况下,我都试图避免这些情况。通常有一些更好的方法,但我不知道你的确切问题。

答案 2 :(得分:0)

你的要求有点不寻常,但这里...... [/ p>

我假设你希望SData对象按需访问NeedThisValue,因为它的值可能会随着时间的推移而改变 - 否则你可以在SData上创建一个属性并注入值将对象添加到集合中时。

我也打算在集合中SData 检索时注入值,因为对检索到的项目的引用可能会很长时间。

这意味着剩下的唯一可行选择是在将每个SData添加到集合时为每个public class SData { public SDataCollection ParentCollection { get; set; } } public class SDataCollection : CollectionBase { public int Add(SData sDataItem) { if (sDataItem != null) { sDataItem.ParentCollection = this; return this.List.Add(sDataItem); } return -1; } } 提供一个引用:

SData

当您在其他代码中使用var thatMagicalValueYouWanted = myRandomSDataObject.ParentCollection.NeedThisValue; 项时,您可以执行以下操作:

{{1}}

现在我应该指出,这不是一个特别好的模式,但这是你的呼唤。