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

Edw*_*uay 20 c# methods static interface abstract

我想要做的就是确保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();
    }
}
Run Code Online (Sandbox Code Playgroud)

和接口似乎也不起作用:

错误:客户未实现接口成员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();
}
Run Code Online (Sandbox Code Playgroud)

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

vik*_*iky 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!

  • 即使Customer/Address没有实现GetHistoricItem函数,它也不会产生任何错误.我错过了什么吗? (3认同)

Dar*_*rov 0

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