隐藏构造函数的嵌套类在c#中是不可能的?

时间:2010-03-13 21:56:22

标签: c# programming-languages language-features

我最近一直在做一些编程并面临一个问题,我在c#中发现了一些奇怪的问题。 (至少对我来说)

public class Foo
{
    //whatever
    public class FooSpecificCollection : IList<Bar>
    {
         //implementation details
    }
    public FooSpecificCollection GetFoosStuff()
    {
         //return the collection
    }
}

我希望Foo的消费者能够获得对FooSpecificCollection的引用,甚至对它执行一些操作。甚至可能将它设置为Foo的其他属性或像这样的smth,但不能创建此类的实例。 (应该能够实现此集合的唯一类应该是Foo。

我的要求真的那么牵强吗?我知道人们更聪明地定义了c#但是不应该有这样一个选项,即父类可以创建一个嵌套的类实例,但没有其他人不能。

到目前为止,我创建了一个解决方案,通过属性创建一个抽象类或接口,并实现一个在其他任何地方都无法使用的具体私有类。

这是处理这种情况的正确方法吗?

5 个答案:

答案 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)

不,这没有用。

我的意思是整个观点是你可能会返回其他实例;但无论如何谁会从那个阶级派生出来?当然不是任何其他类(因为那是错误的,暗示它不应该隐藏在主类中),所以......