Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除了使用嵌套类之外,还有没有其他方法可以在C#中创建子对象?_C#_Nested Class - Fatal编程技术网

除了使用嵌套类之外,还有没有其他方法可以在C#中创建子对象?

除了使用嵌套类之外,还有没有其他方法可以在C#中创建子对象?,c#,nested-class,C#,Nested Class,我正在构建一个名为MyLib的类的项目清单,库初始化需要相当长的时间,只需执行一次。之后,可以使用相关的item类随意创建库存中任何item的实例,但是除非对库进行实例化,否则不允许进行item实例化。我发现实现这一点的唯一方法是将item类嵌套在library类中,如下所示,但我想知道是否有更好的方法来实现这一点 public class MyLib { protected string LibFilePath; public MyLib () {

我正在构建一个名为
MyLib
的类的项目清单,库初始化需要相当长的时间,只需执行一次。之后,可以使用相关的item类随意创建库存中任何item的实例,但是除非对库进行实例化,否则不允许进行item实例化。我发现实现这一点的唯一方法是将item类嵌套在library类中,如下所示,但我想知道是否有更好的方法来实现这一点

public class MyLib 
{
    protected string LibFilePath;

    public MyLib ()
    {
        /* Time-consuming Library initialization code here
           needs to be done only once

         LibFilePath initialized
         etc.

         */
    }

    public class LibItem1
    {
        /* Must ensure that MyLib is initialized
         * Must have access to Library information like LibFilePath, etc.
         */
    }
}

您也可以这样强制:

public class MyLib 
{
    public static void InitializeMyLib(...)
    {
        if (instance != null)
        {
            throw new InvalidOperationException("Already initialized");
        }

        instance = new MyLib(...);
    }

    public static MyLib GetInstance()
    {
        if (instance == null)
        {
            throw new InvalidOperationException("Not initialized");
        }

        return instance;
    }

    private MyLib(...)
    {
        ...
    }

    private static MyLib instance;
}

public class LibItem1
{
    public LibItem1()
    {
        MyLib.GetInstance(); // will throw if doesn't exist
    }
}

如果这里有一个独生子女是可以的,那么你对这个类行为的描述就符合这个模式。当然,为了简单起见,可以使用普通的首次使用时创建模式,而不是
InitializeMyLib
GetInstance
单独的方法。但是,我猜情况并非如此,因为这样您就不必在初始化之前禁止创建
Libitem1

您应该查看。这可能会解决你的问题。我之所以建议使用这种方法,是因为它们现在编写的方式不同,您隐藏了存在初始化的事实。对于工厂模式,我们知道有一些逻辑正在发生。感谢您的回复。我通过向LibItem1构造函数添加MyLib类参数,并向MyLib类添加方法来执行LibItem1请求的操作,而不是直接访问MyLib字段,从而解决了这个问题。