如何强制继承类在C#中实现静态方法?

时间:2009-12-15 08:51:46

标签: c# interface static methods abstract

我想要做的就是确保的子类实现静态方法,并且我希望对其进行检查在编译时避免运行时错误。

使用静态方法的抽象类似乎不起作用:

  

错误:静态成员   不能标记为   覆盖,虚拟或抽象

public abstract class Item
{
    public static abstract Item GetHistoricalItem(int id, DateTime pastDateTime);
}

public class Customer : Item
{
    public static override Customer GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Customer();
    }
}

public class Address : Item
{
    public static override Address GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Address();
    }
}

并且界面似乎也不起作用:

  

错误:客户未实施界面   成员GetHistoricalItem()

public class Customer : Item, HistoricalItem
{
    public static Customer GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Customer();
    }
}

public class Address : Item, HistoricalItem
{
    public static Address GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Address();
    }
}

interface HistoricalItem
{
    Item GetHistoricalItem();
}

是否有一些解决方法让编译器检查继承类是否实现了具有特定签名的静态方法?

5 个答案:

答案 0 :(得分:20)

我找到了适用于您的方案的解决方法:

public class Customer : Reference<Customer>, IHistoricalItem
{
}

public class Address : Reference<Address>, IHistoricalItem
{
}

public interface IHistoricalItem
{
}

public class Reference<T> where T : IHistoricalItem, new()
{
    public static T GetHistoricItem(int id, DateTime pastDateTime)
    {
        return new T();
    }
}

希望这会有所帮助!!

答案 1 :(得分:4)

答案 2 :(得分:3)

强制客户端实现静态方法没有意义 - 静态方法是“不可变的”。 (可能有更好的方式来描述它们,但我现在可以想出来了!)

如果需要某种覆盖,我会考虑重新访问设计,可能会使用某种形式的单例和注射组合。

答案 3 :(得分:2)

答案 4 :(得分:0)

根据定义,静态方法不能在派生类中实现。