C# “最好的方法是什么?”;继承;一组静态变量和例程,以便可以重写它们

C# “最好的方法是什么?”;继承;一组静态变量和例程,以便可以重写它们,c#,inheritance,static,C#,Inheritance,Static,我在这里和谷歌上读了一些关于努力完成任务的文章。我可能把事情复杂化了 现在在大家说之前,我知道您不能继承静态成员/例程。我要问的是如何正确地做我需要做的事情 我正在编写一个静态助手类,它有许多成员和例程。根据任务的性质,它必须是静态的,所以我不能做一个实例,除非你告诉我其他情况 我需要做的是创建一个基本的静态类,它只会工作并执行逻辑(Helper),但是我需要创建一个新的类(本质上是静态的),我可以将其放入一个或多个“新”静态方法中,这些静态方法覆盖基本方法,但是这个类现在的行为与基本类类似——

我在这里和谷歌上读了一些关于努力完成任务的文章。我可能把事情复杂化了

现在在大家说之前,我知道您不能继承静态成员/例程。我要问的是如何正确地做我需要做的事情

我正在编写一个静态助手类,它有许多成员和例程。根据任务的性质,它必须是静态的,所以我不能做一个实例,除非你告诉我其他情况

我需要做的是创建一个基本的静态类,它只会工作并执行逻辑(Helper),但是我需要创建一个新的类(本质上是静态的),我可以将其放入一个或多个“新”静态方法中,这些静态方法覆盖基本方法,但是这个类现在的行为与基本类类似——通过其成员传递

我首先想到使用接口,但这需要一个实例


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

看起来您的一个类可能是普通类。然后,您可以使用组合将两者结合在一起,以实现您所需要的。我会像这样把事情分解:

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
}

看起来你的一门课可能是普通课。然后,您可以使用组合将两者结合在一起,以实现您所需要的。我会像这样把事情分解:

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
}

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

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

请参阅以下答案:了解为什么抽象静态类不能在c中使用#

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

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}
看看这个答案:理解为什么抽象静态类不能在c中使用#

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

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

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

如果您试图避免依赖System.Web everywhere,您可以使用一种依赖注入

// 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的帮助程序,则只需要在顶层引用System.Web。您甚至可以使用反射仅在运行时有条件地加载HelperWeb程序集。

如果您试图避免依赖System.Web everywhere,您可以使用一种依赖项注入

// 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的帮助程序,则只需要在顶层引用System.Web。您甚至可以使用反射仅在运行时有条件地加载HelperWeb程序集。

我们需要一个示例,说明您正在尝试完成的任务……我们需要一个示例,说明您正在尝试完成的任务……问题是基类必须具有静态属性和例程,也就是说,至少我认为必须具有静态属性和例程。它是一个nHibernate助手,用于连接会话工厂和其他内容。我的意图是将引用System.Web的逻辑分离到“扩展”静态类中。我无法创建一个实例,请考虑单例模式(无论如何,以我的知识为基础)。为什么不在这里使用单例模式,以确保您只有一个实例,并且在所有情况下都使用相同的实例。然后你就可以实现你想要的继承了。等等。我只是重读了你的答案。啊!我可以试试,但我相信你是对的。因为我只做了一个到静态类的路由,无论是扩展类还是直接到基类,做上面的操作都是一样的,不是吗?“instanced”类是否会在应用程序的生命周期内保持可用,即应用程序启动时的web实例?@jzworkman-如果OP确实需要一个静态类,单例模式将不会有帮助。单例不一定是静态的……它是一个实例类,只能有一个自身的实例。静态类没有实例。@jzworkman老实说,因为我不完全理解它。我得到了它的jist,但不是它应该被使用的全部工作原因。。。这是其中一个原因吗?问题是基类必须有静态属性和例程,也就是说,至少我认为它必须是静态的。它是一个nHibernate助手,用于连接会话工厂和其他内容。我的意图是将引用System.Web的逻辑分离到“扩展”静态类中。我无法创建一个实例,请考虑单例模式(无论如何,以我的知识为基础)。为什么不在这里使用单例模式,以确保您只有一个实例,并且在所有情况下都使用相同的实例。然后你就可以实现你想要的继承了。等等。我只是重读了你的答案。啊!我可以试试,但我相信你是对的。因为我只做了一个到静态类的路由,无论是扩展类还是直接到基类,做上面的操作都是一样的,不是吗?“instanced”类是否会在应用程序的生命周期内保持可用,即应用程序启动时的web实例?@jzworkman-如果OP确实需要一个静态类,单例模式将不会有帮助。单例不一定是静态的……它是一个实例类,只能有一个自身的实例。静态类没有实例。@jzworkman老实说,因为我不完全理解它。我得到了它的jist,但不是它应该被使用的全部工作原因。。。这会是其中一个原因吗?在我继续之前,我还有一个问题:我这么做的全部原因