也许是一个令人困惑的标题,我所追求的是一个类,它只有一定数量的实例。仍然困惑?
我实际上是一个星级评级列表(无,一半,一,一半)等等所以我需要一个类(或者一个结构?),它有两个字段,值和字符串表示(现在无论如何,导致其他领域;图像的URL等)。我需要一个容器,一个List,一个ObservColl,IEnumerable,只需要包含它们。
但我不希望除了容器对象之外,任何东西都可以对该类进行实例化,但仍然可以将类作为一种类型设置为另一个类的字段。
这可能吗?或者我将不得不在途中牺牲一些东西?
答案 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以返回具体实现?