1

我需要 C# 中静态抽象方法的替代方法:

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

我只有两个条件RequiredStaticMethod

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

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

4

2 回答 2

3

您无法在compile-time验证它。但是,如果您要使用反射调用该方法(因此您不需要任何类型的多态性),您可以只记录每个具体派生类必须实现特定方法,然后编写一个单元测试来检查程序集所有派生类型并检查它们是否符合。

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

于 2013-03-14T16:29:29.450 回答
1

您不能在 C# 中执行此操作。相反,它可能会帮助您使用抽象实例方法和单例模式:

abstract public class BaseClass
{
    abstract public void RequiredStaticMethod();
}

sealed class Subclass : BaseClass
{
    public static readonly Subclass Instance = new Subclass();

    public void RequiredStaticMethod() {}    
}

您可能想要添加对您要解决的潜在问题的进一步描述。通常,您使用抽象类将消费者与实际实现分离,方法是让它们使用抽象类型。然而,这显然不能用静态成员来完成。正如乔恩评论的那样,我还看不出你打算如何消费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");
    }
}
于 2013-03-14T16:17:24.560 回答