c#:静态基类方法存根,在所有派生类中都有*必需的*实现

本文关键字:实现 派生 存根 类方法 基类 静态 | 更新日期: 2023-09-27 18:04:00

我需要一个c#中静态抽象方法的替代方案:

// fantasy code
abstract public class BaseClass
{
    static abstract public void RequiredStaticMethod();
}

对于RequiredStaticMethod我只有两个条件:

  1. 所有的派生类必须实现它(由编译器强制)。
  2. 它必须在没有类实例的情况下可用;即DerivedClass.RequiredStaticMethod()必须工作。

实现这一目标的最佳方法是什么?

c#:静态基类方法存根,在所有派生类中都有*必需的*实现

您无法在编译时验证它。但是,如果您要用反射调用方法(因此不需要任何形式的多态性),您只需文档说明每个具体的派生类必须实现一个特定的方法,然后编写一个单元测试,该单元测试在程序集中搜索所有派生类型并检查它们是否符合。

它不像编译时检查那么好,但是假设您控制了所有相关的程序集,并且假设您已经足够频繁地运行单元测试,那么它应该是相当轻松的。

在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");
    }
}