Я создал класс для генерации 2 похожих, но очень разных отчетов. Для этого я использовал шаблон, который я нашел здесь: https://stackoverflow.com/a/29907649/3410196 Он использует абстрактный базовый класс, который содержит частные производные классы с общедоступными конструкторами, поэтому другой код никогда не может фактически получить доступ к конструкторам производного класса и создавать объекты только с использованием метода static Create()
,Абстрактный класс с частными производными классами: реализовать метод для некоторых
Теперь я столкнулся с проблемой: Все работает отлично, и я могу экспортировать отчеты и т.д. Но теперь я должен быть в состоянии экспортировать один отчетов в другом формате. Есть ли способ сделать этот метод доступным через базовый класс только для одного производного класса? В противном случае мне придется throw new NotImplementedException()
или заставить свои пользователь использовать что-то вроде этого:
//Is actually multiReport (multireport:report)
Report report = Report.Create(...);
MemoryStream stream = (report as multireport).ExportOtherFormat();
Я сомневаюсь, что это возможно, но, может быть, есть способ!
Создайте класс, ответственность которого заключается в экспорте ваших отчетов. Например, у вас может быть экспортер CSV, экспортер XML и т. Д. Этот класс возьмет ваш базовый класс отчета в качестве параметра. Создание и экспорт ваших отчетов, вероятно, являются двумя отдельными обязанностями, поэтому они должны быть в разных классах. –
Действительно, я должен был реализовать это с самого начала, это было бы намного лучше. Однако уже слишком поздно, потому что слишком много приложений уже используют мою библиотеку. Извлеченный урок. Я думаю, –
Не можете ли вы добавить еще один метод в свою библиотеку, который использует IExporter в качестве параметра? Затем вы можете создать несколько экспортеров, и пользователи вашей библиотеки могут затем сказать, как они хотят экспортировать, передав соответствующую реализацию экспортера?Например, public void Export (экспортер IExporter) –