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