Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приведение типов в наследниках


Андрей Жук ©   (2005-08-09 14:58:00) 

Есть у нас базовый тип - TDBGrid.
Я реализовал его наследника, в котором добавил методы SaveToHTML, SaveToXLS etc.
В программе вызов идет так (например)
 TMyDBGrid(GetMainGrid).SaveToHTML(FileName, false);
Решил я использовать DBGridEh. Который наследует TCustomGrid.
Преобразование DBGridEh в DBGrid возможно обычным образом TDBGrid(DBGridEh)
Однако, когда я преобразовываю дальше в MyDBGrid, то при попытке считать свойство DataSource получаю AV.
Оно, конечно не проблема, потому что как я выяснил, у DBGridEh есть также свои методы сохранения.
Но что я делаю не так?


evvcom   (2005-08-09 15:32:00) [1]


> Преобразование DBGridEh в DBGrid возможно обычным образом
> TDBGrid(DBGridEh)

Это не преобразование. Это называется приведением типов. Если TDBGridEh унаследован от TDBGrid, то данное приведение типов попросту лишнее. Приведение же TMyDBGrid(DBGridEh) иногда сработает, иногда чревато:
1. Нормально отработают обращения к полям или вызовы любых методов, присутствующим у общего предка (TCustomGrid).
2. Статический метод из TMyDBGrid вызовется тоже нормально, но если в нем идет обращение к полям, отсутствующим в TCustomGrid, в лучшем случае получим AV, в худшем будет тихо нарушена логика работы программы, но в дальнейшем где-то скорее всего опять будет AV.
3. Вызов виртуального метода, отсутствующего в TCustomGrid, также приведет либо к AV, либо к нарушению логики работы.


Андрей Жук   (2005-08-09 15:13:00) [2]

Забыл...
Это же, наверное, статическое преобразование. А нужно динамическое (в С++ так называются)


Игорь Шевченко   (2005-08-09 15:07:00) [3]

As не проще ?


Digitman   (2005-08-09 15:06:00) [4]


> Однако, когда я преобразовываю дальше в MyDBGrid


TDBGridEh ничего не знает про TMyDBGrid

оба они наследники TCustomGrid, но совершенно разные

Петя - сын Вовы
 Федя - сын Пети
 Ваня - сын Пети
   Вася - сын Феди
   Иван - сын Вани

Вася НЕ обязан знать ничего о Ване.

Но при том и Вася и Ваня - непрямые потомки Пети.


Наверх

Титульная страница Поиск, карта сайта Написать письмо