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

20

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

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

    
задан Edward Tanguay 15.12.2009 в 09:51
источник

5 ответов

20

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

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

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

    
ответ дан viky 15.12.2009 в 10:14
источник
  • +1 Вот как решить проблему OP. –  Groo 15.12.2009 в 10:19
  • Это не создает ошибок, даже когда клиент / адрес не реализует функцию GetHistoricItem. Я что-то упускаю? –  Bill 24.07.2012 в 21:40
  • @Yongke Bill Yu: почему вы думаете, что это должно быть? –  jwaliszko 26.11.2012 в 16:22
4

Это невозможно сделать.

Посмотрите Почему я не могу иметь абстрактный статические методы в c #?

    
ответ дан Adriaan Stander 15.12.2009 в 09:56
источник
3

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

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

    
ответ дан Rich 15.12.2009 в 10:01
источник
  • У меня есть элемент класса, который наследуют различные объекты, например. Клиент, Адрес и т. Д. И если класс имеет тип Item, то я хочу иметь возможность вызвать фабричный метод на нем с именем GetHistoricalItem (). Поэтому я хочу иметь возможность сказать адрес Address = Address.GetHistoricalItem (...). И я хочу знать во время компиляции, что все мои классы, которые наследуют Item, делают это. Он должен работать так же, как, например, методы. –  Edward Tanguay 15.12.2009 в 10:11
  • @EdwardTanguay это уже давно, но вам лучше создать какой-то класс истории (экземпляр), который содержит обычные методы для извлечения адресов. Например, регистр будет хорошим именем. –  Maarten Bodewes 26.11.2012 в 19:27
0

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

    
ответ дан Darin Dimitrov 15.12.2009 в 09:55
источник