2010-06-24 48 views
2

也许一个令人困惑的标题,我后面是一个类,它只有一定的实例化。仍然困惑?所以我需要一个类(或者一个结构?),它有两个字段,值和字符串代表(现在反正,导致其他领域;图像的网址等)。我需要一个容器,一个List,ObservColl,IEnumerable,只是包含它们的东西。用预定义的类创建一个列表类,这是无法创建列表的<t>类

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

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

+1

仍然困惑.. – simendsjo 2010-06-24 07:58:25

+0

难道你不能使用枚举来描述评级,并且一些工厂根据枚举生成各种类型的评级数据吗? – Mathias 2010-06-24 08:18:10

回答

3

我希望这是你想要什么:

使类公共或内部(如需要),但构造私有:

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; } 
    } 
} 
+0

也是我的解决方案。留下问题:什么是“单身”的复数形式? – 2010-06-24 08:15:31

+0

@Henk枚举类型 – 2010-06-24 08:16:53

+2

从MyList返回一个不可变的值(例如IEnumerable ),并且可能不会打扰懒惰的初始化 - 使其线程安全,这会增加复杂性。 – 2010-06-24 08:19:42

0

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

  • 公共(完全访问权限)
  • 内部(只从同一命名空间中的类)
  • 受保护的(仅从本身和派生类)
  • 私人(只从本身)

最接近的事情你可以做,以实现你的意思是创建一个仅包含你的“容器”级和你的“星级”类的新的命名空间,使星级构造内部。但是,如果你(或其他人)扩展该名称空间,构造函数将可用于名称空间的所有成员。

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(); 
     } 
    } 
} 
+0

只有'Container'类将能够创建'InnerType'的实例,并且自定义集合将限制所有不是'InnerType'的添加。 – decyclone 2010-06-24 08:13:06

0

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