Как заставить наследовать классы для реализации статического метода в С#?

Все, что я хочу сделать, это обеспечить, чтобы дочерние классы класса Элемент реализовали метод static, и я хочу, чтобы это было проверено во время компиляции, чтобы избежать ошибок времени выполнения.

абстрактные классы со статическими методами не работают:

ОШИБКА: статический член не могут быть отмечены как переопределить, виртуально или абстрактно

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

Есть ли какое-то обходное решение для этого, чтобы проверить компилятор, реализуют ли наследующие классы статический метод с определенной сигнатурой или нет?

Ответ 1

Существует обходной путь, который я определил для вашего сценария:

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

Надеюсь, это поможет!

Ответ 3

Не имеет смысла заставить клиентов внедрять статический метод - статические методы "неизменяемы". (Вероятно, есть лучший способ описать их, но все мои мысли могут возникнуть прямо сейчас!)

Если требуется какое-то переопределение, я бы подумал о повторном посещении дизайна, возможно, используя какую-то комбинацию синглетонов и инъекций.

Ответ 5

По определению статический метод не может быть реализован в производных классах.