繁体   English   中英

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

[英]C# - Class design & 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(){}”,但我读到我不应该这样做......

你有什么推荐的人?

  protected static void PrivateMethod() {}

没问题(除名称外)并做你需要的。 你不需要base. 从Derived中调用它时。

我之前从未听过这个,所以我去找一些说你所描述的东西。 我发现了这篇文章: 新设计指南:避免受保护的静态 但是,它只涉及受保护的静态字段。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM