鉴于以下内容:
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(){}”,但我读过我不应该这样做......
你推荐什么人?
答案 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),它可以作为参数传递,也可以通过反射确定。