什么是“继承”一组静态变量和例程的最佳方法,以便可以覆盖它们

时间:2012-03-01 16:05:48

标签: c# inheritance static

我已经在这里和Google上阅读了很多关于尝试完成任务的文章。我可能过于复杂了。

现在在你们都说出来​​之前,我知道你们不能继承静态成员/例程。我要问的是如何正确地做我需要做的事。

我正在编写一个静态助手类,它有许多成员和例程。根据它所使用的任务的性质,它必须是静态的,所以除非你告诉我,否则我不能创建它的实例。

我需要做的是创建一个基类静态类,它只能工作并执行逻辑(The Helper)但是我需要能够创建一个新类(Static本质上),我可以放在一个或多个“新”静态方法中,它们覆盖基本方法,但此类现在就像基类一样 - 通过其成员。

我首先想到使用Interface但需要一个实例。

您认为解决此问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

看起来你的一个班级可能是普通班级。然后,您可以使用合成将两者结合在一起,以实现您的需求。我会像这样分手:

internal class TaskProcessor
{
    // All of the work/logic goes in this class which can have instances
}

public static class StaticHelper
{
    private TaskProcessor _processor = new TaskProcessor();

    public static void SomeMethod()
    {
        _processor.SomeMethod();
    }

    // And so on
}

答案 1 :(得分:1)

对我来说,这是extension methods的全部目的。允许以安全的方式在符合标准的类型之间共享功能。您可以使用相同的扩展方法进行重载,以便为dispirit类型提供不同的功能,同时保留语义相似的代码。

答案 2 :(得分:0)

请参阅此答案:Why can't I have abstract static methods in C#?以了解为什么不能在c#

中使用抽象静态类

您还可以使用单例模式来确保您的类只存在一个实例:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

答案 3 :(得分:0)

如果你试图避免在任何地方依赖System.Web,你可以使用一种依赖注入。

// Base assembly; does not reference System.Web
public class HelperBase
{
    public virtual void DoSomething() { ... }
    public virtual void DoSomethingElse() { ... }
}

public static class StaticHelper
{
    public static HelperBase Helper { get; set; }
    static void DoSomething()
    {
        Helper.DoSomething();
    }

    static void DoSomethingElse()
    {
        Helper.DoSomethingElse();
    }
}

// HelperWeb assembly; references System.Web, base assembly
public class HelperWeb : HelperBase
{
    // override base implementation, using System.Web
    public virtual void DoSomethingElse() { ... }
}


// usage at top level:

StaticHelper.Helper = new HelperBase();
// or
StaticHelper.Helper = new HelperWeb();

StaticHelper.DoSomething();

这样,StaticHelper不需要引用System.Web。如果您实际使用的是需要System.Web的Helper,则只需要在顶层引用System.Web。您甚至可以使用反射仅在运行时有条件地加载HelperWeb程序集。