我需要在C#中替代静态抽象方法:
// fantasy code
abstract public class BaseClass
{
static abstract public void RequiredStaticMethod();
}
RequiredStaticMethod
只有两个条件:
DerivedClass.RequiredStaticMethod()
必须有效。实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
在编译时验证它无能为力。但是如果你打算用反射来调用方法(所以它不像你需要任何类型的多态性)你可以只文档每个具体的派生类必须实现一个特定的方法,然后写一个单元测试,它扫描所有派生类型的程序集并检查它们是否符合。
它不如编译时检查那么好,但假设您控制了所有涉及的程序集,并假设您已经足够频繁地运行单元测试,那么它应该是相当轻松的。
答案 1 :(得分:1)
你不能在C#中这样做。相反,它可以帮助您使用抽象实例方法和Singleton模式:
abstract public class BaseClass
{
abstract public void RequiredStaticMethod();
}
sealed class Subclass : BaseClass
{
public static readonly Subclass Instance = new Subclass();
public void RequiredStaticMethod() {}
}
您可能想要添加对您尝试实现的潜在问题的进一步描述。通常,您使用抽象类来使将消费者与实际实现分离,方法是使它们使用抽象类型。但是,显然,静态成员无法做到这一点。正如Jon评论的那样,我无法看到你计划如何消费BaseClass
。
您也可以使用界面,并通过反射查找所有实现类型。这将产生一个IFoo
的类型化迭代,并以实例绑定的方式调用您的方法:
class Program
{
public static void Main()
{
var classes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterface("IFoo") != null);
foreach(var foo in classes.Select(c => Activator.CreateInstance(c)).Cast<IFoo>())
{
foo.RequiredNonStaticMethod();
}
}
}
public interface IFoo
{
void RequiredNonStaticMethod();
}
public class FooImpl : IFoo
{
public void RequiredNonStaticMethod()
{
Console.WriteLine("Foo");
}
}