C# - 类设计和访问修饰符

3

以下是给定的内容:

public abstract class Base
{
  // other stuff

  public static void StaticMethod()
  {
    PrivateMethod();
  }
  // here should be PrivateMethod() declaration somehow
}
public sealed class Derived: Base
{
  // other stuff

  public void InstanceMethod()
  {
    // call somehow PrivateMethod 
    PrivateMethod(); 
  }
}

我需要在两个不同的上下文(不同的程序集)中使用PrivateMethod()。第一次通过调用Base.StaticMethod(),第二次是使用Derived类的实例d.InstanceMethod();

我正在寻找如何设计Base类中的PrivateMethod()的方法。当然,PrivateMethod()不应该在Base和Derived类之外可见。

我考虑过"protected static PrivateMethod() {}",但我读到了不应该这样做...

你们有什么建议?


也许您可以更改需求,在这种情况下,您会找到另一种解决方案,但在这种特定情况下,您只有一个选择-受保护的静态方法。 - Sergey Teplyakov
1
你在哪里看到不应该那样做的建议,为什么不应该那样做? - Frederik Gheysels
我认为在这里:http://blogs.msdn.com/b/brada/archive/2004/09/09/227332.aspx。但请注意,Brad建议“避免”而不是“不使用”。 - Sergey Teplyakov
请查看以下链接:http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx ... 也请检查最后一段内容... 或许我在那里误解了什么。 - Learner
我看到你们都推荐了我心中所想的...非常感谢你们的支持! - Learner
我会多开几个小时,以防其他人有不同的意见。 - Learner
3个回答

2
我之前从未听说过这个,所以我开始寻找描述你所说内容的东西。我找到了这篇文章:新设计指南:避免使用受保护的静态字段。然而,它只谈到了受保护的静态字段。
我认为这篇文章并没有很好地论证它想要表达的观点。它并没有仅仅描述受保护的静态字段会导致复杂性,而是使用了一个非常简单的例子来说明基类设计者没有为不应该被所有人访问的内容设置正确的访问标志。
尽管如此,受保护的静态字段确实可能会导致复杂性。受保护的静态字段意味着任何子类都可以在任何时候调用一个方法。如果方法编写得不够谨慎,这可能会导致线程安全问题。看起来这篇文章的写作方式传达的是“不要这样做”而不是“如果需要这样做,请小心”。

谢谢您的推荐,非常有帮助!干杯! - Learner

2
  protected static void PrivateMethod() {}

除了名称之外,这个功能很好并且满足你的需求。在从派生类中调用它时,你不需要base.

谢谢您的快速回复。问题是我在查看此链接后才提出了这个问题:http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx ...也许我在那里误解了什么? - Learner
(快速阅读后)作者从“封装作为安全性”角度看待这个问题。对于库设计者来说有一定的有效性,但在应用程序中并不相关。重点似乎是:你可能会诚实地公开它。 - H H
谢谢您重新表述... :) 现在我明白文章想要表达什么了。 - Learner

0
你可以在派生类的实例方法中调用公共的 StaticMethod(),因为它会间接调用 PrivateMethod(),这样你就可以保留 PrivateMethod() 的私有性。实现代码如下:
public abstract class Base
{
  // other stuff

  public static void StaticMethod()
  {
    PrivateMethod();
  }

  // here should be PrivateMethod() declaration somehow
  private static void PrivateMethod()
  {
    // do stuff
  }
}
public sealed class Derived: Base
{
  // other stuff

  public void InstanceMethod()
  {
    // call somehow PrivateMethod 
    StaticMethod(); 
  }
}

PS:如果在静态方法中需要区分公共调用者或派生类调用者(来自实例方法),可以将其作为参数传递,或通过反射确定。


谢谢您的解决方案,虽然我认为您想指出与“Artur Mustafin”类似的东西。InstanceMethod需要调用PrivateMethod,而不是StaticMethod。 - Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接