代码之家  ›  专栏  ›  技术社区  ›  Psytronic

使用预定义类创建列表类,这是不可能在列表类之外创建列表类的

  •  2
  • Psytronic  · 技术社区  · 15 年前

    可能是一个令人困惑的标题,我想要的是一个类,它只有一定数量的实例化。还困惑吗?

    实际上,我想要的是一个星级列表(无、半、一、一和半)等,所以我需要一个类(或者一个结构?)它有两个字段,即值和字符串表示(目前为止,它还可以指向其他字段;图像的URL等)。我需要一个容器,一个列表,observcoll,ienumerable,只是一些东西来包含它们。

    但是我不希望类可以被任何东西实例化,除了容器对象,但是类仍然可以作为一个类型被设置为另一个类上的字段。

    这可能吗?还是我要牺牲一些东西?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Hinek    15 年前

    我希望这就是你想要的:

    使类成为公共的或内部的(根据需要),但构造函数是私有的:

    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(); 如果需要,也可以使用静态属性和privat静态字段实现它:

    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; }
        }
    }
    
        2
  •  1
  •   decyclone    15 年前
    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();
            }
        }
    }
    
        3
  •  0
  •   Matteo Mosca    15 年前

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

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

    这个 最近的 要实现您的意思,您可以做的事情是创建一个只包含“容器”类和“星级”类的新名称空间,并使星级构造函数成为内部的。

    不过,如果您(或其他人)要扩展该命名空间,则该构造函数将对该命名空间的所有成员都可用。

        4
  •  0
  •   Darren Lewis    15 年前

    将星级暴露为容器的接口,并在容器上有工厂以返回具体实现?