|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.05.2012, 06:07 | #11 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Согласен с GunSmoker. Всегда существует способ решить проблему проще и изящнее. А это уже городилово пошло. ТС, почитайте еще раз внимательно про 3 кита ООП, обдумайте заново вашу концепцию ПО, возможно все проще станет. А вообще используйте интерфейсы.
"ковыряю изнутри" (с)
|
14.05.2012, 15:03 | #12 |
Регистрация: 12.05.2012
Сообщений: 9
|
Благодарен всем, кто принял участие. Постарался внимательно переварить сказанное. Если подытожить, то я так понимаю, что моя ошибка заключалась изначально в неправильном проектировании класса логгера. Действительно, не зная на какой подкласс ведет в данный момент указатель, невозможно передать ему и нужный параметр (хотя, возможно в этом бы помогла проверка типов, но это уже из раздела "лишь бы выпутаться").
Вероятно при проектировании класса нужно было изначально исходить из особенностей реализации и создать несколько базовых классов для работы с журналом лога различных форматов. А я-то старался сделать максимально обобщенный класс, хотя казалось, что уровню абстракции нет предела и обобщить можно даже до такого уровня. Конечно продолжу изучать основы ООП, но с интересом буду следить за данным топиком и дальше, если вдруг кто-то захочет выразить свое, отличное от других, мнение. |
14.05.2012, 15:11 | #13 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Ну, если отвлечься от твоей трактовки, то можно посмотреть в сторону таких двух вариантов (для наглядности оба покажу на примере интерфейсов).
Вариант первый: Код:
а). Должны быть реализованы конкретным классом-наследником. б). Могут использоваться классом-наследником для комплексного вызова. К примеру, DumpXML(const XML: IXMLNode) в наследнике может сводиться к набору вызовов DumpStr. Вариант 2: Код:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
14.05.2012, 15:30 | #14 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
ТС, обойдите проблему внимательно вокруг сделать класс прилагательно к чему? К логгеру, чтобы он мог логгировать в разных фоматах: xml, html, txt и т.д. Что передавать параметром в абстрактный виртуальный метод исходного класса-предка? Правильно, текст события для логгирования, т.е. строку. Так почему бы не сделать всю реализацию логгирования локальной в соответствующих методах классов-потомков? Например, вы переопределяете метод Log(const AStr:AnsiString). Вот в нем и записывайте строку в том формате, в котором вам надо. Т.е. не нужно параметром передавать КОНЕЧНЫЙ формат данных, а лучше ИСХОДНЫЙ. Надеюсь, мысль понятна.
"ковыряю изнутри" (с)
|
14.05.2012, 15:59 | #15 |
Регистрация: 12.05.2012
Сообщений: 9
|
GunSmoker, спасибо, попробую поработать над интерфейсами.
3D Hunter, да, изначально так и планировал. Но сразу столкнулся со сложностью, что лог-сообщение может быть не только "плоской" строкой, но и структурированной. И если я передам такую строку в класс, который работает с XML форматом, то в этой процедуре Log(const AStr:AnsiString) мне придется каким-то образом парсить строку, чтобы получить в итоге что-то типа <ENTRY> <DATETIME>2012-05-10 12:25:20</DATETIME> <MODULE>Sheduler</MODULE> <MESSAGE>Task execution is finished</MESSAGE> </ENTRY> |
14.05.2012, 16:16 | #16 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Так используйте перегрузку методов, чтобы передавать столько параметров, сколько вам надо в данном потомке (например, то же время, имя модуля и текст лога для xml-логгера).
Зачем вы так рьяно и шаблонно следуете концепциям ООП? Кто сказал, что нужно программировать ТОЛЬКО так? Кажется, вы сами придумали себе ограничение и пытаетесь его преодолеть.
"ковыряю изнутри" (с)
|
14.05.2012, 16:18 | #17 |
Регистрация: 12.05.2012
Сообщений: 9
|
Передо мной была также поставлена задача учесть и то, что лог-сообщением может выступать не только строка (собственно, и XML же по сути это набор символов, только структурированный), но и полноценный объект, который также придется скидывать в файл, т.е. делать сериализацию. И вот тут уже объект как строку не передашь (хотя наверное все что угодно можно перевести в набор символов, но разве это будет самым элегантным решением?).
На решение создать один базовый класс, как я описал в самом начале, подтолкнуло то, что по сути круг задач для логгера в принципе то один: как минимум скинуть некий лог в файл. А вот научить классы-потомки работать с разными типами этих сообщений выросло вот в этот "огород". |
14.05.2012, 16:22 | #18 |
Регистрация: 12.05.2012
Сообщений: 9
|
3D Hunter, да-да, получается, что я когда-то узнал, что можно создавать общий класс, который будет решать задачи в общем виде, а от него уже плясать дальше. И значит пока не хватает опыта, чтобы определиться до каких пор нужно "так рьяно следовать концепциям ООП". Хотя изначально, умозрительно, задача казалась простой: есть базовый класс-шаблон, нужно лишь разработать несколько производных от него классов, которые будут по своему реализовывать запись в файл ))
Благодарю за дельные советы |
14.05.2012, 16:35 | #19 |
Форумчанин
Регистрация: 26.03.2012
Сообщений: 665
|
А как вы собираетесь использовать? я к тому что, а оно надо ваще эта абстракция?
|
14.05.2012, 16:48 | #20 |
Регистрация: 12.05.2012
Сообщений: 9
|
Я собирался передавать в процедуру потомка лог-запись определенного типа. Концепция казалось простой. Теперь я вижу, что проще отказаться от такой абстракции. Но, как говорится, осадочек остался. Стало безумно интересно как бы эту задачу решили например ребята из Борланда? А так конечно мне еще придется очень многому научиться, в том числе и у всех вас.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перегрузка виртуальных функций при полиморфизме | Стремящийся | Общие вопросы C/C++ | 2 | 06.05.2012 10:23 |
снова об виртуальных машинах. | Пепел Феникса | Общие вопросы по программированию, компьютерный форум | 12 | 25.08.2011 23:35 |
перегрузка виртуальных функций | tiger() | Visual C++ | 2 | 04.05.2011 07:35 |
Конфликт виртуальных серверов | ZvEr_HaCkEr | Свободное общение | 4 | 19.04.2011 18:37 |
Построение виртуальных миров | qqwer1984 | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 28 | 19.07.2010 21:22 |