C#与嵌套类

时间:2016-01-15 03:14:50

标签: c# inheritance

我是一名学习C#的C ++开发人员,而且我需要一个C类才能拥有两个属于它的成员代表"机器人。"机器人需要能够访问C的私人成员,并且他们不需要在其他任何地方使用。在C ++中我会使用"朋友"关键字,但我不知道该怎么做。我想做这样的事情:

class C
{
    private Member mem;
    private Robot bot;

    private class Robot
    {
        C owner;
        public void function() { //Robot needs to use owner.mem here, 
                                 //but can't because it's private}
    };
}

麻烦的是,我不知道怎么说机器人是拥有的#34;通过C的实例,可以访问其成员。

3 个答案:

答案 0 :(得分:2)

一种方法是将外部类的实例作为参考传递给内部类的构造函数。

class C
{
    private Member mem;
    private Robot bot;

    private class Robot
    {
        C owner;
        public Robot(C c) {owner = c;}
        public void function()
        { 
           // Robot can use owner.mem here
        }
    };
}

答案 1 :(得分:1)

没有friend的直接等价物 - 最接近的({并且非常接近)是InternalsVisibleToAttribute但是它打破了类之间的关系并破坏了OO语言的一些基本属性。

我遇到的唯一合适的解决方案是创建一个接口ICClass,它只公开公共方法,并使Factory返回ICClass接口。

这涉及相当多的单调乏味 - 在界面中再次暴露所有自然公共财产。

答案 2 :(得分:1)

有大量关于此问题的主题:Why does C# not provide the C++ style 'friend' keyword?

"机器人需要在这里使用owner.mem,但不能,因为它是私有的"

我认为您希望Protected使用继承模型:

class C
{
    protected Member mem;
    protected Robot bot;
}

private class Robot : C
{
   public void function() { 
      base.mem...  // here you can use the base classes mem and bot
   };
}