Nested class with hidden constructor impossible in c#?
最近我做了一些编程,遇到了一个问题,在C中我觉得很奇怪。(至少对我来说)
1 2 3 4 5 6 7 8 9 10 11 12 | public class Foo { //whatever public class FooSpecificCollection : IList<Bar> { //implementation details } public FooSpecificCollection GetFoosStuff() { //return the collection } } |
我希望foo的消费者能够获得对foospecificCollection的引用,甚至可以对其执行一些操作。甚至可以将其设置为foo或smth的其他属性,但不能创建此类的实例。(唯一能够初始化此集合的类应该是foo。
我的请求真的那么牵强吗?我知道人们定义的C更聪明,但不应该有这样一个选项,父类可以创建嵌套类实例,但其他人都不能。
到目前为止,我创建了一个解决方案,通过属性使抽象类或接口可用,并实现了一个具体的私有类,该类在其他任何地方都不可用。
这是处理这种情况的正确方法吗?
嵌入式类的工作方式是,作为外部类的成员,它们可以访问外部类的私有成员。但不是反过来(你想要什么)。
您可以屏蔽foospecificCollection的构造函数,但工厂必须是foospecificCollection本身的一部分。它可以征募外部阶级:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 } } |
制作嵌套类
另外,从
如果您正在创建一个库供其他人使用,那么您可以创建构造函数
我们一直在创建与其他类不直接相关的类,但是构造函数不必对非相关类隐藏。我们(程序员)知道这些对象是不相关的,所以我们从不创建其中一个的实例。
有一个解决方案,但我不认为我会在我的应用程序中使用它:)其思想是从FOOSpecific派生类,该类是私有的,只能在FOO内部使用,但具有公共构造函数,因此FOO可以创建其实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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(); } } |
不,这也没什么意义。
我的意思是,关键是您可以返回其他实例;但无论如何,谁将从该类派生?当然没有其他类(因为这是错误的,并且暗示它不应该隐藏在主类中),所以…