C# 从类继承值的最佳实践?

C# 从类继承值的最佳实践?,c#,C#,我想创建一个collectionbase类构造,如下所示: 在所有项目中达到(int-NeedThisValue)的最佳实践是什么,这个类添加了什么 public class SDataCollection : CollectionBase { public SDataCollection() { } #region Properties /// <summary> /// Gets/Sets value for the item b

我想创建一个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
}
public类SDataCollection:CollectionBase
{
公共SDataCollection()
{
}
#区域属性
/// 
///获取/设置该索引项的值
/// 
公共SData本[int索引]
{
得到
{
返回(SData)此.列表[索引];
}
设置
{
此.List[索引]=值;
}
}
public int NeedThisValue{get;private set;}
#端区
#区域公共方法
公共国际指数(SData sDataItem)
{
if(sDataItem!=null)
{
返回base.List.IndexOf(sDataItem);
}
返回-1;
}
公共int添加(SData sDataItem)
{
if(sDataItem!=null)
{
返回此.List.Add(sDataItem);
}
返回-1;
}
公共无效删除(SData sDataItem)
{
this.InnerList.Remove(sDataItem);
}
公共void AddRange(SDataCollection集合)
{
if(集合!=null)
{
this.InnerList.AddRange(集合);
}
}
公共无效插入(int索引,SData sDataItem)
{

如果(index如果希望仅由SDataCollection的子类访问该属性,请使用访问修饰符

保护


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

公开的

如果不希望该属性被SDataCollection以外的任何对象访问,请使用

私人的


这是C#面向对象101。

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

internal SDataCollection Parent { get; set; }
然后,您可以通过覆盖OnInsert/OnRemove/Start/OnClear来设置/取消设置父项。您必须检查该项是否由一个且仅由一个集合附加


在任何情况下,我都会尽量避免这些情况。通常有更好的方法,但我不知道您的确切问题。

您的要求有点不寻常,但这里有

我假设您希望
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;

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

我不确定我是否理解你的问题-需要访问什么
NeedThisValue
?是用户(消费者)对于
SDataCollection
类,或者您通过索引器添加的项?这些项,通过索引器添加的内容…由于OP在评论中留下的更新信息,这个答案没有解决问题。他想从数据项访问
NeedThisValue
。它的好模式是什么?我只想,这是集合属性值可以通过items访问。一旦我实例化了一个类,什么是inherit CollectionBase。然后我向它添加了项,并且只希望通过此CollectionBase继承类添加的项可以达到集合属性值…@user1692315理想情况下,集合项应该没有知识或知识集合本身的概念。如果你详细说明
所需的值是什么,我可能会提出一些建议。基本上是创建一个3d模型类。这个类可以实例化,取决于我想要控制的模型数量。让我们称它为模型类。这个类有一个IModelable属性,它是通过工厂提供的,this包含例如权重。但我需要为每个实例化模型类(如运动学)添加其他组件。因此我发现,我在模型类中创建了一个通用集合,并将这些组件放入其中。问题是,如果我创建了一个新组件(如运动学),它应该知道ord中模型类的IModelable属性值我尝试创建一个架构,其中有一个实例化的类,有一个collectionbase继承。所以我可以自由添加项(实例化的类)我的目标是,如果我在item中调用一个方法,那么就可以得到集合属性值。我知道,我可以使用构造函数或其他任何东西,但我很好奇有没有更好的解决方案来实现这一点。