繁体   English   中英

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

[英]How can I force inheriting classes to implement a static method in C#?

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

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

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

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

希望这可以帮助!!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM