20

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

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

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

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();
}

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

4

5 回答 5

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();
    }
}

希望这可以帮助!!

于 2009-12-15T09:14:38.587 回答
4

这是无法做到的。

看看为什么我不能在 c# 中使用抽象静态方法?

于 2009-12-15T08:56:11.320 回答
3

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

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

于 2009-12-15T09:01:34.727 回答
2

似乎不可能,看看:有没有办法强制C#类实现某些静态函数?

于 2009-12-15T08:55:09.967 回答
0

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

于 2009-12-15T08:55:00.317 回答