我是一名学习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的实例,可以访问其成员。
答案 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
};
}