我最近一直在做一些编程并面临一个问题,我在c#中发现了一些奇怪的问题。 (至少对我来说)
public class Foo
{
//whatever
public class FooSpecificCollection : IList<Bar>
{
//implementation details
}
public FooSpecificCollection GetFoosStuff()
{
//return the collection
}
}
我希望Foo的消费者能够获得对FooSpecificCollection的引用,甚至对它执行一些操作。甚至可能将它设置为Foo的其他属性或像这样的smth,但不能创建此类的实例。 (应该能够实现此集合的唯一类应该是Foo。
我的要求真的那么牵强吗?我知道人们更聪明地定义了c#但是不应该有这样一个选项,即父类可以创建一个嵌套的类实例,但没有其他人不能。
到目前为止,我创建了一个解决方案,通过属性创建一个抽象类或接口,并实现一个在其他任何地方都无法使用的具体私有类。
这是处理这种情况的正确方法吗?
答案 0 :(得分:4)
制作嵌套课程private
,并使GetFoosStuff
IList<Bar>
的返回值代替FooSpecificCollection
。
此外,deriving from List<Bar>
is a bug很有可能。
答案 1 :(得分:4)
嵌入式类的工作方式是,作为外部类的成员,它们可以访问该外部类的私有成员。但不是相反(你想要的是什么)。
你可以屏蔽FooSpecificCollection的构造函数,但是Factory必须是FooSpecificCollection本身的一部分。它可以招募外部类:
public class Foo
{
public class FooSpecificCollection : List<Bar>
{
private FooSpecificCollection () { }
public static FooSpecificCollection GetFoosStuff()
{
var collection = new FooSpecificCollection ();
PrepareFooSpecificCollection(collection);
return collection;
}
}
private static void PrepareFooSpecificCollection(FooSpecificCollection collection)
{
//prepare the collection
}
}
答案 2 :(得分:3)
如果要创建供其他人使用的库,则可以创建构造函数internal
。图书馆外的任何人都无法访问它。如果您担心在自己的项目中调用构造函数,则不要在父类之外调用它。
我们一直创建与其他类没有直接关系的类,但不必从非相关类中隐藏构造函数。我们(程序员)知道对象不相关,所以我们不会在另一个中创建一个实例。
答案 3 :(得分:1)
有一个解决方案,但我不认为我会在我的应用程序中使用它:) 我们的想法是从FooSpecific派生类,它是私有的,只能在Foo中使用,但有公共构造函数,所以Foo可以创建它的实例。
public class Foo
{
//whatever
public class FooSpecific
{
// Protected contructor.
protected FooSpecific()
{
}
// All other code in here.
}
// Private helper class used for initialization.
private class FooSpecificInitHelper : FooSpecific
{
public FooSpecificInitHelper()
{
}
}
// Method in foo to create instaces of FooSpecific.
private FooSpecific CreateFooSpecific()
{
return new FooSpecificInitHelper();
}
}
答案 4 :(得分:0)
不,这没有用。
我的意思是整个观点是你可能会返回其他实例;但无论如何谁会从那个阶级派生出来?当然不是任何其他类(因为那是错误的,暗示它不应该隐藏在主类中),所以......