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

如何强制继承类在C#中实现静态方法?,c#,interface,static,methods,abstract,C#,Interface,Static,Methods,Abstract,我所要做的就是确保类项的子类实现静态方法,我希望在编译时检查该方法以避免运行时错误 带有静态方法的抽象类似乎不起作用: 错误:一个静态成员 不能标记为 覆盖、虚拟或抽象 和接口似乎也不起作用: 错误:客户未实现接口 成员GetHistoricalItem() 是否有一些解决方法让编译器检查继承类是否实现了具有特定签名的静态方法?根据定义,静态方法不能在派生类中实现。似乎不可能,请看一看:这是无法实现的 看看强制客户端实现静态方法是没有意义的——静态方法是“不可变的”。(可能有更好的方法来描述它们

我所要做的就是确保的子类实现静态方法,我希望在编译时检查该方法以避免运行时错误

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

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

和接口似乎也不起作用:

错误:客户未实现接口 成员GetHistoricalItem()


是否有一些解决方法让编译器检查继承类是否实现了具有特定签名的静态方法?根据定义,静态方法不能在派生类中实现。

似乎不可能,请看一看:

这是无法实现的


看看

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


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

我为您的场景找到了一个解决方案:

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();
    }
}
公共类客户:参考,IHistoricalItem
{
}
公共类地址:引用,IHistoricalItem
{
}
公共接口IHistoricalItem
{
}
公共类引用,其中T:IHistoricalItem,new()
{
公共静态T GetHistoricItem(int id,DateTime pastDateTime)
{
返回新的T();
}
}

希望这有帮助

我有一个不同对象继承的类项,例如Customer、Address等。如果一个类是Item类型的,那么我希望能够对它调用一个名为GetHistoricalItem()的工厂方法。所以我想说Address=Address.GetHistoricalItem(…)。我想知道在编译时,我所有继承项的类都是这样做的。它的工作方式应该与实例方法相同。@EdwardTanguay这是很久以前的事了,但最好创建一个历史类(实例),其中包含从中检索地址的常规方法。例如,Register是一个很好的名称。即使Customer/Address没有实现GetHistoricItem函数,它也不会产生任何错误。“我遗漏了什么吗?”永科比尔:你为什么认为应该?
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();
}
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();
    }
}