Как я могу вынудить наследующие классы реализовать статический метод в C#?

Все, что я хочу сделать, удостоверяются, что дочерние классы класса реализация Объекта статический метод и я хотим, чтобы это было проверено во время компиляции для предотвращения ошибок периода выполнения.

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

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

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

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

20
задан Edward Tanguay 15 December 2009 в 08:51
поделиться

5 ответов

4
ответ дан 30 November 2019 в 00:40
поделиться

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

0
ответ дан 30 November 2019 в 00:40
поделиться

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

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

3
ответ дан 30 November 2019 в 00:40
поделиться

Я придумал обходной путь для вашего сценария:

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

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

20
ответ дан 30 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: