方法只能在外面访问?

时间:2011-06-28 18:46:07

标签: c# .net vb.net

是否可以让方法具有只能在外部调用并且永远不能在内部调用的方法?如果是这样的话?

Public Class Foo
  Public Sub New()
    Bar ' Should fail to compile as Bar is only accessible externally.'
  End Class
  Public External Sub Bar()
  End Sub
End Class

5 个答案:

答案 0 :(得分:4)

不,这在C#或VB中是不可能的。你为什么想要呢?为什么你会“信任”类 less 中的代码而不是它之外的代码?

答案 1 :(得分:2)

  

是否可以让方法具有只能在外部调用并且永远不能在内部调用的方法?如果是这样的话?

不,这不可能在编译时停止(你可以在运行时遍历堆栈,但那闻起来很可怕)。

你能解释一下你为什么要这个吗?

答案 2 :(得分:1)

如果你明确地实现了一个接口,那么实现需要一个强制转换;听起来不像你想要的那样,但它可能会起作用吗?但是,也许最好概述为什么你要求这个,可能有一个更好的整体方法......

public class Foo : IBar
{
    void IBar.Bar() {}

    void AMethod() { 
        Bar(); // Compile Failure
        ((IBar)this).Bar(); // No failure
    }
 }

请注意,这需要外部代码也将对象引用为IBar,这可能使它更不适合作为您的解决方案。遗憾。

答案 3 :(得分:0)

我认为不可能以一种简单的方式,通常是反过来,你想在内部使用某些东西并阻止消费者调用内部事物。在内部,作为班级的设计者,您知道事情是如何运作的,并且您不需要被阻止访问某些方法。

班上的设计师/编码员可能已经编写了内部方法和公共方法,因此他/她将知道不应该从内部调用什么...如果它有意义...如果你有一个好的设计我有点怀疑。

答案 4 :(得分:0)

我很好奇你为什么要这样做?以往?

但是,不,简而言之,你做不到。你是开发人员,所以请确保你永远不要打电话。

现在你可以尝试强制它在运行时失败:

public void MyExternalOnlyMethod(object sender) 
{
    if(sender==this) throw new ICantCallMeException();
}

当然,你必须确保你对这个方法的内部方法调用(你不应该开始写)必须发送“this”作为发送者......

但就像其他人说的那样......

<强>为什么???

尽可能接近使用抽象方法,但这只是要求派生类实现您自己不会在类中使用的某些功能。