嘿,我经常遇到这样一种情况:我将创建一个只能由一个或几个类实例化的类。在这种情况下,我会将其构造函数设为私有,并使其成为应该能够实例化它的对象的友元类。例如(在C ++中):
class CFoo
{
friend class CFoo;
// private ctor because only a select few classes should instantiate
private:
CFoo()
{
... Do stuff
}
}
class CBar
{
// CBar is one of the few classes that only need to use CFoo
CFoo *m_pFoo;
CBar()
{
m_pFoo = new CFoo;
}
}
所以我的问题是:这是愚蠢的吗?或者有更好的方法来实现这一目标吗?考虑到语言完全缺少friend关键字,我对C#的工作方式特别感兴趣。感谢。
答案 0 :(得分:2)
这里的目标似乎是,在你有一个可行的CBar之前你不能拥有CFoo。
您可以通过为CFoo创建一个私有构造函数,然后在CFoo中创建一个静态方法来获取相同的结果,该方法接受一个CBar参数并调用所述构造函数并返回新的CFoo。
这类似于System.Drawing.Graphics.FromImage(Image image)方法。
为什么C#没有好友关键字的问题已涵盖elsewhere。
答案 1 :(得分:1)
在C#中,取决于如何使用类,您可以在另一个范围内定义一个类。
public class CBar
{
CBar()
{
m_pFoo = new CFoo();
}
CFoo m_pFoo;
private class CFoo
{
CFoo()
{
// Do stuff
}
}
}
答案 2 :(得分:1)
你可以看看标记CFoo内部
internal class CFoo
答案 3 :(得分:0)
仅仅因为只有少数特定类使用CFoo,并不意味着你应该明确地阻止其他人使用它。如果这确实是需要,您可能需要重新考虑您的设计。你肯定不想在代码中强制使用这么多的耦合。注意提供一些关于你为什么这样做的细节,所以我们最好建议一个好的解决方案?
答案 4 :(得分:0)
为了帮助思考它是否是愚蠢的,你能提供更具体的例子吗?
我会说没有充分理由使用朋友听起来有点奇怪...在C#中你有汇编这样的东西,所以你可以使用内部构造函数或私有构造函数和几个静态创建方法具有不同的访问权限(受保护,公共,内部...)
答案 5 :(得分:0)
首先,朋友声明是在错误的班级。 CFoo需要朋友CBar才能让CBar访问它的私人成员。
其次,是的,通常应该避免这种情况。类应该很少关心它们的使用方式和位置。如果他们这样做,那么该功能可能应该以不同方式分解。
答案 6 :(得分:0)
只需将课程设为私有。这只是将范围限制为你的dll(exe等)。没有什么比C#中的朋友声明那么酷,但Marcin是正确的,你应该重新考虑这样的设计。如果你真的需要'朋友'支持,你可以使用反射在运行时模拟它。