创建具有预定义类的列表类,这是不可能在其外部创建列表<t>类</t>

时间:2010-06-24 07:53:29

标签: c# class

也许是一个令人困惑的标题,我所追求的是一个类,它只有一定数量的实例。仍然困惑?

我实际上是一个星级评级列表(无,一半,一,一半)等等所以我需要一个类(或者一个结构?),它有两个字段,值和字符串表示(现在无论如何,导致其他领域;图像的URL等)。我需要一个容器,一个List,一个ObservColl,IEnumerable,只需要包含它们。

但我不希望除了容器对象之外,任何东西都可以对该类进行实例化,但仍然可以将类作为一种类型设置为另一个类的字段。

这可能吗?或者我将不得不在途中牺牲一些东西?

4 个答案:

答案 0 :(得分:3)

我希望这就是你想要的:

将类设为public或internal(如您所需),但构造函数为private:

public class MyClass
{
    private MyClass() { }
}

然后在类中创建一个公共或内部静态方法来获取列表:

public class MyClass
{
    // ...
    public static List<MyClass> GetList()
    {
        List<MyClass> list = new List<MyClass>();
        list.Add(new MyClass());
        // ...
        return list;
    }
}

您现在只能通过此方法获取列表。 List<MyClass> a = MyClass.GetList();如果您愿意,也可以使用静态属性和私有静态字段来实现它:

public class MyClass
{
    // ...
    static MyClass()
    {
        myList = new List<MyClass>();
        myList.Add(new MyClass());
        // ...
    }
    private static List<MyClass> myList = null;
    public static List<MyClass> MyList
    {
        get { return myList; }
    }
}

答案 1 :(得分:1)

public interface IInnerType
{
    Int32 Id { get; set; }
}

public class Container
{
    public Container()
    {
        Items = new InnerTypeCollection();
        Items.Add(new InnerType() { Id = 1 });
        Items.Add(new InnerType() { Id = 2 });
        Items.Add(new InnerType() { Id = 3 });
        Items.Add(new InnerType() { Id = 4 });
        Items.Add(new InnerType() { Id = 5 });
    }

    public InnerTypeCollection Items { get; protected set; }

    class InnerType : IInnerType
    {
        public InnerType()
        { }

        public Int32 Id { get; set; }
    }

    public class InnerTypeCollection : ICollection<IInnerType>
    {
        List<IInnerType> Items { get; set; }

        public InnerTypeCollection()
        {
            Items = new List<IInnerType>();
        }

        public void Add(IInnerType item)
        {
            if (!(item is InnerType))
            {
                throw new ArgumentException("item must be of InnerType");
            }
            Items.Add(item);
        }

        public void Clear()
        {
            Items.Clear();
        }

        public bool Contains(IInnerType item)
        {
            return Items.Contains(item);
        }

        public void CopyTo(IInnerType[] array, int arrayIndex)
        {
            Items.CopyTo(array, arrayIndex);
        }

        public int Count
        {
            get { return Items.Count; }
        }

        public bool IsReadOnly
        {
            get { return (Items as ICollection<IInnerType>).IsReadOnly; }
        }

        public bool Remove(IInnerType item)
        {
            return Items.Remove(item);
        }

        public IEnumerator<IInnerType> GetEnumerator()
        {
            return Items.GetEnumerator();
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return Items.GetEnumerator();
        }
    }
}

答案 2 :(得分:0)

构造函数的访问级别可以设置为以下内容:

  • 公开(完全访问)
  • 内部(仅来自同一命名空间中的类)
  • 受保护(仅限自身和派生类)
  • 私人(仅限自己)

最接近的你可以做的就是创建一个新的命名空间,只包含你的“容器”类和你的“星级”类,并使星级评级构造函数内部。< / p>

但是,如果您(或其他人)要扩展该命名空间,那么构造函数将可用于命名空间的所有成员。

答案 3 :(得分:0)

将Star Rating作为接口从容器中公开,并在容器上放置Factory以返回具体实现?