![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 12.05.2012
Сообщений: 9
|
![]()
Добрый день, уважаемые участники форума. Ищу более опытных людей для решения непосильной пока для меня задачи. Сразу к делу:
Есть абстрактный класс TLogger, описывающий журнал событий (лог). Конечно в нем можно встретить самую наверное основную функцию всех логгеров - запись некоего сообщения в файл или, например, таблицу базы данных. Ну вот что-то вроде: Код:
Код:
Код:
Код:
Заранее спасибо за участие! |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 15.02.2008
Сообщений: 621
|
![]()
однако порно ^_^
Код:
Помог? Ну так нажми на весы!
![]() |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
override из наследника нужно убрать
предупреждение типа "метод WriteEntry скрыл виртуальный метод базового типа" останется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#4 | ||
Форумчанин
Регистрация: 15.02.2008
Сообщений: 621
|
![]() Цитата:
Цитата:
Либо я вас не правильно понял. А вообще лучше покажите что вы имели введу.
Помог? Ну так нажми на весы!
![]() |
||
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Согласен, переклинило насчет абстрактного
![]()
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#6 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Оверрайд нужен конечно, хотя бы потому, что клиент не обязан знать конкретного типа логгера , если ему его подвязывают извне, а просто вызывать методы, которые ясное дело виртуальные.
Метод SNUPY вроде как на первый взгляд неплох (надо будет попробовать мне, самому иногда подобные мысли приходят), но опять же , как сделать общий интерфейс класса, когда мы не должны знать о конкретном потомке... Я бы предложил довольно избитый способ - способ борланда, передавать (всеми любимый, гы) Sender: TObject, ну, или точнее в данном случае pEntry: Object , если конечно подхакерить (ну точнее баловаться контрактом), то можно кидать и строки туда в виде WriteEntry(TObject(MyStr)), но если сильно уперлись строки , то можно вместо TОbject сразу Pointer объявить, а там уж каждый наследник кастует к нужному ему типу. Только есть небольшой геморрой в этом, я бы уберегся создав собственную иерархию оберток под объекты, т.е. создать базовый Tentry, в него нужные поля, потом куча наследников этого энтри со своими полями, ну а логгер абстрактный принимает этjго Tentry, а каждый потомок логгера кастует эту ентрю к своему типу. Последний раз редактировалось phomm; 13.05.2012 в 10:30. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 15.02.2008
Сообщений: 621
|
![]()
Немного допешу что я имел введу =)
Код:
Помог? Ну так нажми на весы!
![]() |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Из вопроса не ясно, а зачем, собственно, нужен виртуальный абстрактный метод у класса-предка. Ведь вызвать его нельзя.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#9 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
Ну, абстрактный метод не может быть не виртуальным. Обычно такие абстрактные классы являются шаблонами-заготовками для полноценных рабочих классов. Например, как класс TStrings.
Как вариант, действительно, в методе предка тип параметра лучше сделать вообще Pointer или Variant: Код:
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Я не это имел в виду.
Абстрактные методы нужны, чтобы их можно было вызывать, имея на руках экземпляр базового класса, не зная точных деталей реализации. В задаче же, как она указана в вопросе, метод вообще нельзя вызвать, не зная деталей реализации. Иными словами, если у нас есть ссылка на TLogger, мы не можем вызвать WriteEntry, не зная о том, какой именно это подкласс (чтобы передать ему нужный параметр). Внимание, вопрос: а нафига этот метод тогда нужен?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перегрузка виртуальных функций при полиморфизме | Стремящийся | Общие вопросы 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 |