关于编程语言:c#中隐藏构造函数的嵌套类是不可能的?

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
    }
}


制作嵌套类private,使GetFoosStuffIList的返回值代替FooSpecificCollection

另外,从List派生的很有可能是一个bug。


如果您正在创建一个库供其他人使用,那么您可以创建构造函数internal。图书馆外的任何人都无法访问它。如果您关心在自己的项目中调用构造函数,那么不要在父类之外调用它。

我们一直在创建与其他类不直接相关的类,但是构造函数不必对非相关类隐藏。我们(程序员)知道这些对象是不相关的,所以我们从不创建其中一个的实例。


有一个解决方案,但我不认为我会在我的应用程序中使用它:)其思想是从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();
    }
}

不,这也没什么意义。

我的意思是,关键是您可以返回其他实例;但无论如何,谁将从该类派生?当然没有其他类(因为这是错误的,并且暗示它不应该隐藏在主类中),所以…