簡體   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