C#:静态基类方法存根,在所有派生类中都带有* required *实现

时间:2013-03-14 16:10:29

标签: c# methods static abstract

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

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

RequiredStaticMethod只有两个条件:

  1. 所有派生类都必须实现它(由编译器强制执行)。
  2. 必须在没有班级实例的情况下可用;即,DerivedClass.RequiredStaticMethod()必须有效。
  3. 实现这一目标的最佳方法是什么?

2 个答案:

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