C# - 班级设计&访问修饰符

时间:2011-01-18 11:49:48

标签: c# access-modifiers

鉴于以下内容:

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(); 
  }
}

我需要从2个不同的上下文(不同的程序集)中使用PrivateMethod()。调用Base.StaticMethod()后,第二次使用Derived类d.InstanceMethod();的实例。

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

我在考虑“protected static PrivateMethod(){}”,但我读过我不应该这样做......

你推荐什么人?

3 个答案:

答案 0 :(得分:2)

  protected static void PrivateMethod() {}

可以(除名称外)并按照您的要求行事。从Derived中调用它时,您不需要base.

答案 1 :(得分:2)

我之前从未听过这个,所以我去找一些说出你所描述的东西。我找到了这篇文章:New Design Guideline: Avoid Protected Static。但是,它只涉及受保护的静态字段。

我认为这篇文章并没有真正说明它想说的内容。它不是仅仅描述受保护的静态可能导致复杂性,而是使用一个非常简单的基类设计器示例,即不为每个人都不应该访问的东西设置正确的访问标志。

话虽如此,仍然有一点保护静电会导致并发症。受保护的静态意味着任何子类都可以随时调用方法。如果该方法是天真地写的,这可能导致线程安全问题。看起来这篇文章是以传达“不要做”的方式而不是“如果你需要这样做,要小心。”

答案 2 :(得分:0)

您可以从派生类的StaticMethod()中调用公开InstanceMethod() ...因为它无论如何都会回到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:如果在StaticMethod期间需要区分公共调用者或派生类调用者(来自InstanceMethod),它可以作为参数传递,也可以通过反射确定。