【问题标题】:Create new instance of private class in another private class在另一个私有类中创建私有类的新实例
【发布时间】:2015-06-30 01:55:47
【问题描述】:

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

提出这个问题是因为我正在关注 PluralSight 的 Scott Allen 的 C# Fundamentals With 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?

【问题讨论】:

  • 这两个问题你应该分开问。
  • Kiki,请确保编辑您的帖子以使其与您的评论保持一致(我已将您的 cmets 内联为初始版本,但您需要对其进行编辑以使其清晰)。
  • 感谢阿列克谢。添加示例
  • -1 private class 修饰符不能在类外使用。如果没有看到容器类的嵌套,这个问题就无法回答。该死的单独文件(你好public partial class
  • 我想知道你为什么是我的问题 -1。没有愚蠢的问题。愚蠢的问题是没有被问到的问题......而且我并不是在假装自己是专家。

标签: c# inner-classes private-members


【解决方案1】:

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

仅当您要为其创建实例的私有类在要创建实例的私有类中声明时。如果它们不嵌套,则不可能。

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

是的,可以。

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

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();
    }
}

【讨论】:

    【解决方案2】:

    没有。私有类不能被不同文件中的另一个类访问。原因是修饰符 private 旨在将数据或方法封装在该类中。如果你想从不同的非嵌套类访问一个类,你应该使用 public 或 internal 修饰符。如果是嵌套的,也可以使用protected修饰符。

    【讨论】:

      【解决方案3】:

      不确定您的想法,但这里有一个可能的例子:

      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;
                  }
              }
      
          }
      }
      

      【讨论】:

      • 感谢您的输入。但这不是我的问题。在您的示例中,private2 是否可以创建 private1 的实例。我在 Main() 中明确表示不在。
      • 在 foo() 中,private1 正在创建 private2 的实例。这不是您要问的吗?...当然可以切换,但是为什么呢?
      • Idle_Mind。如果您可以为我清除它,我会将其标记为答案。我第一次没有很好地阅读你的答案。您在同一个 Program 类中定义了 2 个类(Private1 和 Private2)。如果 Private1 和 Private2 是单独的文件(不在 Program 下)怎么办?你的榜样还会站得住脚吗?另外,如果 Private2 类中没有公共构造函数会怎样?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2022-11-23
      • 2020-10-13
      • 2016-08-25
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多