- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑以下代码模式:
// Each foo keeps a reference to its manager
class Foo
{
private FooManager m_manager;
}
// Manager keeps a list of all foos
class FooManager
{
private List<Foo> m_foos;
}
问题:没有办法创建一个新的 Foo 并更新 FooManager 中的 m_foos 列表和新 Foo 实例中的 m_manager 引用而不公开一些私有(private)的(并且冒着有人将列表与实际 Foos 取消同步的风险) .
例如可以在 Foo 中实现构造函数 Foo(FooManager manager)。它可以设置 m_manager 引用,但它无法访问 m_foos 列表。或者您可以在管理器中实现 CreateFoo() 方法。它可以访问 m_foos 列表,但无法在 Foo 中设置 m_manager。
在C++中,显然会声明FooManager是Foo的友元来表达设计意图,但这在C#中是不可能的。我也知道我可以使 Foo 成为 FooManager 的内部类以获得访问权限,但这也不是解决方案(如果 Foo 可以属于多个管理器类怎么办?)
顺便说一句。我知道 .NET 中的“内部”访问,但它要求 Foo 和 FooManager 独立存在于单独的程序集中,这是 Not Acceptable 。
在不公开私有(private)内容的情况下,有什么变通办法吗?
最佳答案
如果我理解正确的话:
public abstract class FooBus
{
protected static FooBus m_bus;
}
public sealed class Foo : FooBus
{
private FooManager m_manager;
public Foo(FooManager fm)
{
if (fm == null)
{
throw new ArgumentNullException("Use FooManager.CreateFoo()");
}
if (m_bus != fm)
{
throw new ArgumentException("Use FooManager.CreateFoo()");
}
m_manager = fm;
}
}
public class FooManager : FooBus
{
private List<Foo> m_foos = new List<Foo>();
public Foo CreateFoo()
{
m_bus = this;
Foo f = new Foo(this);
m_foos.Add(f);
m_bus = null;
return f;
}
}
关于c# - C# 中友元类用例的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5921612/
我意识到在 C++ 中有很多关于友元类的问题。不过,我的问题与特定情况有关。给定以下代码,以这种方式使用 friend 是否合适? class Software { friend class
只是想确保我已经正确理解了这个 friend class A { friend class B; int valueOne; int valueTwo; public: int G
我在不同的命名空间中有两个同名的类。我无法修改类的名称。我想向其中一个类添加一个方法,但我不允许将其添加为公共(public)方法。另一个类作为 ref 类用 C++/CLI 编写,需要访问此方法。我
不确定这是否可能,但我在嵌套命名空间的不同级别中有两个同名的类,我想让更浅的类成为更深的类的 friend 。示例: 在 File1.h 中: namespace A { class Foo
我不是很理解这个概念,或者我是对的......所以让我们以这个“ friend ”类为例: class MyClass{ friend class AnotherClass; private:
设想如下设置。如何从派生类 cout 中调用基类 cout?我可以使用 getBrand() 方法,但我觉得我应该能够直接访问基类的 cout 友元函数。 我修改了一下,尝试了 this.Brand
是否可以便携地执行以下操作: struct structure { structure() {} private: // only allow container copy const
我是一名优秀的程序员,十分优秀!