Как я могу заставить наследующие классы реализовать статический метод в C #? - PullRequest
20 голосов
/ 15 декабря 2009

Все, что я хочу сделать, это убедиться, , что дочерние классы класса Item реализуют метод 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();
}

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

Ответы [ 5 ]

20 голосов
/ 15 декабря 2009

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

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

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

4 голосов
/ 15 декабря 2009
3 голосов
/ 15 декабря 2009

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

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

2 голосов
/ 15 декабря 2009
0 голосов
/ 15 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...