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