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

c#中不可能使用隐藏构造函数的嵌套类?,c#,programming-languages,language-features,C#,Programming Languages,Language Features,我最近一直在做一些编程,遇到了一个我在c#中发现很奇怪的问题。(至少对我来说) 公共类Foo { //随便 公共类集合:IList { //实施细节 } 公共FooSpecificCollection GetFoosStuff() { //归还藏品 } } 我希望Foo的使用者能够获得对FooSpecificCollection的引用,甚至对其执行一些操作。甚至可以将其设置为Foo或smth的其他属性,但不能创建此类的实例。(应该能够稳定此集合的唯一类应该是Foo 我的请求真的那么牵强吗?我知

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

公共类Foo
{
//随便
公共类集合:IList
{
//实施细节
}
公共FooSpecificCollection GetFoosStuff()
{
//归还藏品
}
}
我希望Foo的使用者能够获得对FooSpecificCollection的引用,甚至对其执行一些操作。甚至可以将其设置为Foo或smth的其他属性,但不能创建此类的实例。(应该能够稳定此集合的唯一类应该是Foo

我的请求真的那么牵强吗?我知道人们更聪明地定义了c#,但不应该有这样一种选择,父类可以创建嵌套类实例,而其他任何人都不能

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


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

如果您正在创建一个库供其他人使用,您可以将构造函数
设置为内部的
。库外的任何人都无法访问它。如果您担心在自己的项目中调用构造函数,请不要在父类之外调用它


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

不,这真的没有意义


我的意思是,整个要点是,您可以潜在地返回其他实例;但是谁将从该类派生?当然不是任何其他类(因为这是错误的,并且暗示它不应该隐藏在主类中),因此…

将嵌套类
设为私有类
,并将
GetFoosStuff
的返回值设为IList
,而不是
foosspecificCollection


还有,这是一个很好的机会。

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

嵌入式类的工作方式是,它们作为外部类的成员,可以访问该外部类的私有成员。但不是相反(你想要的是什么)

您可以屏蔽FooSpecificCollection的构造函数,但工厂必须是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
    }
}
公共类Foo
{
公共类集合:列表
{
私有FooSpecificCollection(){}
公共静态FooSpecificCollection GetFoosStuff()
{
var-collection=新的FooSpecificCollection();
准备特定集合(集合);
回收;
}
}
私有静态void PrepareFosSpecificCollection(FooSpecificCollection集合)
{
//准备收藏
}
}

我希望在嵌套类中有一些清晰、简洁的功能,便于阅读和使用(例如某些内部FOO集合上的尼斯接口)。我不想让人们创建这个类。当然,无论如何,他们不应该在这方面有任何业务,但我仍然希望有一个明确的语义,即-这个类帮助您操作一些Foo的东西,但Foo也给了您,您不应该自己创建它。。。内部在程序集中是可以的,但是我不明白为什么它没有意义。我希望使用我的类的开发人员不要尝试实例化它。。。为什么这毫无意义?这里除了派生类还有其他问题。luckyluke:那么让构造函数私有?我以为你在试图阻止外部类创建它的实例。我从一个列表中派生出来,不抱歉,我的意思当然是IList。清单将是内部实施。但这不是问题所在。但感谢您的警惕:)我只是好奇您所说的“从
列表派生出
是一个bug”是什么意思。我查看了链接,但找不到任何东西表明从
列表
派生本身存在问题。99%的时候,当你声称某个东西是列表时,你实际上想说的是它是t(IEnumerable)的枚举。它可以工作,但设计不好,返回类型过于具体。可能你是对的:)它非常类似于工厂模式(我确实考虑过)。总是从你的答案中学到一些东西,谢谢,亨克。在这种情况下,如果有多个'Foo'实例会发生什么?@BillW,如果你真的要使用这种模式,你可能必须通过GetFooStuff()将一个Foo实例传递给PrepareFoosSpecificCollection()。可能重复:好奇:是不是会有多个'Foo'实例,每个都有自己独特的“FooSpecific系列”?是的,就是这样。假设每个客户机都有一个Foo实例(它将由工厂在某个精确的时间创建),Foo将为自己创建一个foosspecific集合。我允许人们访问特定于foo的收藏,这样人们就知道foo在里面有什么,我让他们玩这些东西,但他们不应该创建一个,因为这毫无意义。晚上,我想也许我试图用太多的语义来编写这段代码:)
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
    }
}