假设有如下代码
namespace test
{
    class Class1
    {
        public Class2 Result()
        {
            //return new Class2();
            //这里不能这样返回值。
        }
    }
    class Class2
    {
        private Class2()
        {
            //some code
        }
    }
}我要Class2不能有可使用的构造函数,但又要在Class1类里面返回一个Class2类型的值,这时这个返回语句怎么写?
或者有其他的什么解决方法没?

解决方案 »

  1.   

    class Class2
    {
      private Class2()
       {
       }
      public static Class2 getClass2()
      {
          Class2 cc = new Class2();
          return cc;
      }
    }
    这个是最基本的设计模式
      

  2.   

    1楼的是可以运行。但不是我想要的意思。大家也都没有弄懂我的意思。
    我是说Class2是不能被自己创建一个新的实例的。只有在Class1里用Result()才能返回一个新的实例。就像这个例子Class2 c2;
    //c2=new Class2;
    //这里是不允许的。
    Class1 c1 = new Class1();
    c2 = c1.Result();也许这个是挺麻烦的。
      

  3.   

    我要Class2不能有可使用的构造函数,但又要在Class1类里面返回一个Class2类型的值If Class1 can create Class2, what prevents Class7 or Class8 or Class9 from creating Class2?
      

  4.   

    我不知道怎么解释你们的问题。但是.net framework里本来就有这样的例子。
    就像
    Regex re = new Regex(@"", RegexOptions.Singleline);
    MatchCollection mc = re.Matches(str);MatchCollection本身不能创建一个新的实例,但是可以用re.Matches创建一个新的实例。我需要的就是这个意思。
      

  5.   

    我明白了,要实现这个就是要用internal来修饰。只要它在程序集内可见。
      

  6.   

    MatchCollection本身不能创建一个新的实例,但是可以用re.Matches创建一个新的实例。
    =======================================================================
    那是因为re.Matches(str)返回一个MatchCollection,MatchCollection mc = re.Matches(str);//把一个句柄交给引用变量mc。
      

  7.   

    我刚才看了nomo的代码,就是返回一个新的实例。
      

  8.   

    要么 用internal修饰符,详细请查阅MSDN;
    要么 变态一点吧:    public class W
        {
            public N GetN()
            {
                return N.CreateN(this);
            }
        }    public class N
        {
            private N() { ;}
            public static N CreateN(object Creater)
            {
                if (Creater as W != null)
                {
                    return new N();
                }
                else
                    return null;
            }
        }
      

  9.   


    根据代码,Class2的确是不能创建一个新的实例,除非是在Class2的类内部创建.因为private已经是最小的访问级别了,internal的范围也比private大啊,不知道你是怎么觉得它不可以访问的,private反而可以访问到.按你说的Private也不可以的话,你只好把这个类定义为一个虚类了吧.呵呵
      

  10.   

    class2的构造函数可以写成internal。
    这样可以在class1中访问(因为同处一个程序集里)
    但是在其它的程序集里(比如项目引用后)是不能使用这个构造函数的。
      

  11.   

    class Class2
        {
            private Class2()
            { }        class Class1
            {
                Class2 result()
                {
                    return new Class2();
                }
            }
        }
      

  12.   

    按你的要求只能使用nest class 了,但是这样一来你访问Class1 就比较麻烦了    class Class2
        {
            private Class2()
            {
                Console.WriteLine("Class 2 is created");
            }       internal class Class1
            {
                internal Class2 result()
                {
                    return new Class2();
                }
            }
        }
      

  13.   


    class calss1
    {
       public class2 ReturnClass2()
       {
           return class2.NewClass2();
        }
    }
    class class2
    {
        private class2()
       {}
        public static class2 NewClass2()
        {
           return new class2
        }
    }
      

  14.   

    感谢1、2、17、20、21、22、23、24楼的朋友,感谢所有的朋友,感谢CSDN,感谢CCTV!这个问题真是让你们煞费苦心了。也许这个问题真的没解,但是你们的答案给了我另外的一些开发启发。现在我可以明确一下,我现在需要的就是像这样的代码
    Regex re = new Regex(@"", RegexOptions.Singleline);
    MatchCollection mc = re.Matches(str);
    这样的例子在.Net Framework里还是挺多的。
    我只要能实现这样类似的就可以了,所以我把代码放到另外一个程序集里,然后用internal声明Class2的构造函数就可以了。