Все, что я хочу сделать, удостоверяются, что дочерние классы класса реализация Объекта статический метод и я хотим, чтобы это было проверено во время компиляции для предотвращения ошибок периода выполнения.
абстрактные классы со статическими методами, кажется, не работают:
ОШИБКА: статический участник не может быть отмечен как переопределение, виртуальное, или абстрактное
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();
}
Есть ли некоторое обходное решение для этого, чтобы иметь проверку компилятора, если наследующие классы реализуют статический метод с определенной подписью или нет?
Это невозможно.
Взгляните на Почему я не могу использовать абстрактные статические методы в C #?
По определению статический метод не может быть реализован в производных классах.
Кажется, это невозможно, посмотрите: Есть ли способ заставить класс C # реализовывать определенные статические функции?
Нет смысла заставлять клиентов реализовывать статический метод - статические методы «неизменяемы». (Вероятно, есть способ лучше описать их, но это все, что я могу придумать прямо сейчас!)
Если требуется какое-то переопределение, я бы рассмотрел возможность повторного посещения дизайна, возможно, используя некоторую форму комбинации синглтоны и инъекции.
Я придумал обходной путь для вашего сценария:
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();
}
}
Надеюсь, это поможет !!