覆盖静态类的最佳实践

时间:2010-05-25 08:59:34

标签: c# static override

由于无法覆盖c#中的静态类,如果我想覆盖一个方法,我通常会定义一个与静态方法的签名匹配的委托,然后按以下方式修改方法:

public static void foo(int bar)
{
  if (delegatename!=null)
  {
   delegatename.Invoke(bar);
  }
  else
  {
   //execute previous code as normal
  }
}

我感到有点内疚,知道这有点乱。

任何人都可以建议一个更简洁的解决方案来解决这个问题(除了重写原始结构)

2 个答案:

答案 0 :(得分:4)

您似乎正在使用静态类作为向应用程序中的某些资源提供单个访问点的方法。如果是这种情况,您应该考虑使用Singleton设计模式的实现。这样做,您可以利用非静态类的继承。

public abstract class Base { ... }

public class Impl : Base { ... }

public class Singleton : Impl
{ 
    #region Static Members

    static readonly Singleton _instance = new Singleton(); 

    static Singleton() { } 

    static public Singleton Instance 
    { 
        get  { return _instance; } 
    } 

    #endregion Static Members

    #region Instance Members

    private Singleton() { } 

    // Method overrides goes here...

    #endregion Instance Members
} 

关于如何在C#上实现单例设计模式的深入讨论可以在Implementing the Singleton Pattern in C#文章中找到。

答案 1 :(得分:1)

考虑使用依赖注入,因为静态单例使得测试隔离基本上不可能,并且可重用性非常痛苦。

单身人士很酷,只是不要使用静力学。有很多关于“依赖注入”的资源,谷歌可以很容易地找到它。