У меня есть программа, которая должна иметь возможность взаимодействовать с несколькими платформами, то есть читать/записывать файлы, читать/писать базу данных или читать/писать веб-запросы. Интерфейс платформы выбирается из конфигурации и не изменяется во время работы приложения. У меня есть один класс интерфейса чтения/записи, который наследуется классами, специфичными для платформы, так что это абстрагируется от остальной части программы.Статический интерфейс C# или абстрактная реализация
Моя проблема заключается в том, что у меня есть 10 классов в моей структуре, которые должны будут использовать этот интерфейс. Вместо того, чтобы создавать несколько экземпляров этого класса или передавать одну ссылку на каждый класс, я решил, что имеет смысл сделать интерфейс статическим. К сожалению, я только что узнал, что интерфейсы не могут иметь статические методы, статические методы не могут вызывать нестатические методы, а статические методы не могут быть абстрактными.
Может ли кто-нибудь показать мне другой метод приближения к этой ситуации?
Edit: Спасибо за вход каждого, вот мое решение, основанное на данном примере Патрик Хофман
interface TheInterface
{
void read();
void write();
}
public class X : TheInterface
{
public void read() { //do something }
public void write() { //do something }
}
public class Y : TheInterface
{
public void read() { //do something }
public void write() { //do something }
}
public class FileAccessor
{
public static TheInterface accessor;
public static TheInterface Accessor
{
get
{
if(accessor) return accessor;
}
}
}
Это можно назвать любым классом, как (спасибо!):
static void Main(string[] args)
{
switch (Config.interface)
{
case "X":
FileAccessor.accessor = new Lazy<X>();
case "Y":
FileAccessor.accessor = new Lazy<Y>();
default:
throw new Lazy<Exception>("Unknown interface: " + Config.interface);
}
FileAccessor.Accessor.read();
}
Можете ли вы предоставить код о вашем сценарии ?! Я думаю, что вы могли бы достичь своей цели, используя абстрактный класс с видом шаблона проектирования. –
1) Рассмотрите возможность использования инъекции зависимостей над одноэлементным узлом со статическим аксессуаром. 2) если вы настаиваете на этом типе, используйте 'Lazy' для его реализации. 3) Почему 'GetLibrary()' public? –
CodesInChaos
Спасибо CodesInChaos, вы правы, что должны были быть частными. Сейчас я читаю «Инъекция зависимостей». Могли ли вы привести пример того, как это относится к моему коду? – Scotty