在另一个私有类中创建私有类的新实例

本文关键字:实例 新实例 创建 另一个 | 更新日期: 2023-09-27 18:00:29

是否可以在另一个私有类中创建私有类的实例?(在main()程序中不计算在内。)此外,私有类中的方法是否可能返回私有类型对象?

这个问题的产生是因为我在关注PluralSight的Scott Allen关于C#基础与C#5。在关于类和对象的第2课上,他有一个类似的代码示例:

public GradeStatistics ComputeStatistics()
{
    GradeStatistics stats = new GradeStatistics();
    ...
    ...
}

GradeStatistics定义在一个单独的类文件中,如:

class GradeStatisticss
{
}

内嵌注释:我不是在谈论嵌套类。我的意思是,您有两个类(单独的文件),我想知道一个类是否可以创建另一个类的实例(知道它们都是私有的)。

Edited with examples:
    private class Example1
    {
    }
    private class Example2
    {
        public Example1 DoSomeComputation()
        {
            return new Example1();
        }
    }
    private class Example3
    {
        Example1 ex1 = new Example1();
    }
Is Example3 able to create ex1? Can Example2 return a new instance of Example1?

在另一个私有类中创建私有类的新实例

是否可以在另一个私有类中创建私有类的实例?

仅当要为其创建实例的私有类在要创建实例的专用类内声明时。如果它们没有嵌套,这是不可能的。

私有类中的方法是否可能返回私有类型对象?

是的,可以。

这里有一些代码显示所有内容:

public class Tester {
    private class ThePrivateCreator {
        private class TheOtherPrivateClass {
        }
        public Object createObject() {
            return new TheOtherPrivateClass();
        }
    }
    public void canWeDoThis() {
        ThePrivateCreator c = new ThePrivateCreator();
        Console.WriteLine(c.createObject());
    }
}

class Program
{
    public static void Main(string[] args) {
        Tester t = new Tester();
        t.canWeDoThis();
    }
}

否。其他文件中的另一个类无法访问私有类。原因是修饰符private旨在将数据或方法封装在该类内部。如果要从未嵌套的其他类访问类,则应使用public或internal修饰符。如果它是嵌套的,也可以使用受保护的修饰符。

不确定你到底在想什么,但这里有一个可能的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication26
{
    class Program
    {
        static void Main(string[] args)
        {
            private1 p1 = new private1();
            private2 p2 = p1.foo();
            Console.WriteLine(p2.Value);
            Console.ReadLine();
        }
        private class private1
        {
            public private2 foo()
            {
                private2 p2 = new private2("I was created inside a different private class!");
                return p2;
            }
        }
        private class private2
        {
            private string _value;
            public string Value
            {
                get { return _value; }
            }
            public private2(string value)
            {
                this._value = value;
            }
        }
    }
}