我已经在这里和Google上阅读了很多关于尝试完成任务的文章。我可能过于复杂了。
现在在你们都说出来之前,我知道你们不能继承静态成员/例程。我要问的是如何正确地做我需要做的事。
我正在编写一个静态助手类,它有许多成员和例程。根据它所使用的任务的性质,它必须是静态的,所以除非你告诉我,否则我不能创建它的实例。
我需要做的是创建一个基类静态类,它只能工作并执行逻辑(The Helper)但是我需要能够创建一个新类(Static本质上),我可以放在一个或多个“新”静态方法中,它们覆盖基本方法,但此类现在就像基类一样 - 通过其成员。
我首先想到使用Interface但需要一个实例。
您认为解决此问题的最佳方法是什么?
答案 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程序集。