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