【发布时间】:2013-05-10 11:43:23
【问题描述】:
我希望一个类中的特定方法只能由特定类访问。例如:
public class A
{
public void LimitedAccess() {}
public void FullAccess() {}
}
public class B
{
public void Func()
{
A a = new A();
a.LimitedAccess(); // want to be able to call this only from class B
}
}
public class C
{
public void Func()
{
A a = new A();
a.FullAccess(); // want to be able to call this method
a.LimitedAccess(); // but want this to fail compile
}
}
我可以使用关键字或属性来强制执行此操作吗?
更新:
由于现有系统的复杂性和时间限制,我需要一个影响较小的解决方案。我想在编译时指出 LimitedAccess() 不能使用。我相信 Jon Skeet 的回答,即我所要求的完全不能在 C# 中完成。
这个问题和 Jon 的回答对于以后可能遇到这个问题的人来说是很好的。这种设计有异味的事实有望使任何人转向选择这样的东西作为理想的解决方案。
正如评论中提到的,如果您试图解决类似的情况,C# friend 对话会很有用。
至于我的特殊解决方案:“为什么 A 会包含 B 的逻辑”(@sysexpand 在 cmets 中询问)。这就是问题所在。 B.Func() 在我正在处理的整个系统中被调用,但它主要在 A 的单例上运行。所以我最终做的是将B 的Func() 移动到A 并将A.LimitedAccess() 设为私有。与往常一样,还有一些其他细节需要解决,但我得到了一个影响较小的解决方案,它给了我对A.LimitedAccess() 的调用者的编译时错误。
感谢讨论。
【问题讨论】:
-
你为什么要这样做?
-
我有一个大类
A,它在整个系统中被广泛使用。B类具有其他依赖项,但具有使用 B.LimitedAccess() 的标准/最佳方式。我想尽可能使用B.Func()。 -
请参阅stackoverflow.com/questions/203616/…,您应该将
LimitedAccess标记为内部并通过代码审查发现滥用它。 -
@Jos.Schlitz 恐怕您的代码中存在某种设计错误,我想不出有必要这样做的单一情况。你介意分享一些你的实际代码吗?
-
一个肮脏的选择是从 A 继承 B 并使 LimitedAccess 受保护。如果它在语义上没有意义,不要。
标签: c#