[英]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.