c#:静态基类方法存根,在所有派生类中都有*必需的*实现
本文关键字:实现 派生 存根 类方法 基类 静态 | 更新日期: 2023-09-27 18:04:00
我需要一个c#中静态抽象方法的替代方案:
// fantasy code
abstract public class BaseClass
{
static abstract public void RequiredStaticMethod();
}
对于RequiredStaticMethod
我只有两个条件:
- 所有的派生类必须实现它(由编译器强制)。
- 它必须在没有类实例的情况下可用;即
DerivedClass.RequiredStaticMethod()
必须工作。
实现这一目标的最佳方法是什么?
您无法在编译时验证它。但是,如果您要用反射调用方法(因此不需要任何形式的多态性),您只需文档说明每个具体的派生类必须实现一个特定的方法,然后编写一个单元测试,该单元测试在程序集中搜索所有派生类型并检查它们是否符合。
它不像编译时检查那么好,但是假设您控制了所有相关的程序集,并且假设您已经足够频繁地运行单元测试,那么它应该是相当轻松的。
在c#中不能这样做。相反,它可能会帮助您使用抽象实例方法和单例模式:
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");
}
}