Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Печать результатов деятельности класса |
Автор: Tror 26.9.2007, 16:56 | ||
Доброго дня всем ![]() Не знаю отражает ли название темы ее суть, но ничего другого в голову не пришло. Идея следующая: Есть несколько классов (порядка 10) у всех должна быть возможность выводить свои результаты на несколько устройств(консоль, файл, .......) причем с возможностью настройки формата вывода. Была конечно идея создать интерфейс IPrintable public IPrintable { void PrintToConsole(); void PrintToFile(); void PrintToSmthElse(); } но перспектива во всех 10-15 классах реализации во всех этих классах этого интерфейса меня не очень радует да и к тому же, если у меня появиться необходимость реализовать вывод куда-нибудь еще, придется все переделывать ниже я представил, как я это себе вижу, но мне кажется что моя реализация тоже далека от идеала. Подскажите , пожалуйста, может есть более удачный вариант сделать это
|
Автор: tol05 26.9.2007, 18:58 |
а почему бы не сделать для всех классов http://msdn2.microsoft.com/en-us/library/ty01x675.aspx ? Ты задашь вид серилизуемой информации и будешь серилизовать класс просто в поток. А в зависимости от условий будешь подставлять нужный поток (файл, принтер или еще что-нибудь - все равно это будет какой-то поток). |
Автор: Tror 26.9.2007, 19:43 |
![]() почитал я про эту сериализацию, но мне не до конца ясно когда она вызывается и мне надо не сериализовать объект а на основе шаблона и данных составить результирующую строку. |
Автор: tol05 26.9.2007, 21:09 |
Все, я понял. Серилизация подразумевает восстановление из потока, а тебе это не нужно. Да, можно поступить проще. Переопредели в своих классах ToString() и каждый класс сам будет формировать сообщения о своем состоянии. Причем для использования своих шаблонов форматирования нужно и форматтер определить, который подставляется в ToString() и гибко меняется. 1. Создаешь свой FormatProvider (от IFormatProvider), свой CustomFormatter (от ICustomFormatter) в классы передаешь CustomFormatter (или сразу класс делай наследником ICustomFormatter). 2. Переопределяешь в классе string ICustomFormatter.Format (string pattern, Object arg, IFormatProvider myFormatProvider) и юзаешь String.Format(myFormatProvider, myPattern, myCar) в ToString() - перенаправляешь вызов на этот метод. Можно сделать перегрузки ToString(ICustomFormatter formatter) и просто ToString() (в этом случае внутри ToString() создаешь свой дефолтный форматтер для каждого класса и юзаешь также) пример - msdn "IFormatProvider Interface", причем подробный. Его можно легко "испоганить" под свой класс ![]() Достоинства такого способа: 1. Переопределение ToString() должен делать каждый фанатик мелкософта ![]() 2. Никаких лишних интерфейсов, легкий код снаружи, надежный внутри. 3. Универсальность. Получил строку и используешь ее где хочешь. 4. Практически все стандартные классы имеют перегрузки с ToString() -> возможно неявное использование твоего кода, просто пишешь Console.Write(myCar) и все да, идея это идея получше, аж самому понравилось ![]() |