Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

Ошибка при приведении объекта к типу предка   Найти похожие ветки 

 
AkaSaint ©   (2004-02-14 21:19) [0]

Здравствуйте. Я недавно поднимал этот вопрос, но он так и не решился, но без его решения дальше работать просто невозможно, тем более, что кажется, что я заблудился в 3-х соснах.
Сразу скажу, что очень простенький Delphi6-проект, который у меня воспроизводит описанную ниже проблему, можно взять по адресу:
dobroevse.narod.ru/index.htm, там единственная ссылка.
Краткий смысл ошибки. Есть 3 класса A, B и C, каждый наследуется от предыдущего, а класс А наследуется от потомка TPersistent. У классов B и C перегружен метод Assign. В программе пишу:

var
C1, C2: C;
...
C1 := C.Create(nil);
//...Присвоение полей C1, введенных как в С, так и в B и А.
С2 := C.Create(nil);
C2.Assign(C1);
//Assign присваивает поля, введенные в классе C, а также
//вызывает inherited Assign для присвоения унаследованных
//полей. Результат: в С2 поля, введенные в классе С, имеют те
//же значения, что и у С1. Поля, введенные в предках C, имеют
//нулевые значения.


Если повторить аналогичный пример, используя вместо объектов класса C объекты класса B, то все работает правильно: присвоены значения полей, введенных как в классе А, так и в классе B.
Пожалуйста, помогите разобраться. Заранее спасибо.


 
Максим   (2004-02-14 22:31) [1]

Вполне возможно что у тебя имеется дублирование каких-то действий в Assign класса B и Assign класса С, просмотри внимательно, может они(методы C и B) при последовательном вызове не могут что-то поделить.


 
default ©   (2004-02-14 22:58) [2]

не сильно вникая в твой код, предположу(я даже в этом практически уверен), что ошибка в том, что ты допускаешь дублирование имён полей в классах - устрани это и должно всё закрутиться


 
Defunct   (2004-02-14 23:41) [3]

default оказался абсолютно прав.

В Вашем случе
AkaSaint © (14.02.04 21:19)

Измнените описание класса TBSOService на следующее:

TBSOService = class(TBSOServiceShowcase)
public
Date:TDateTime;
procedure Assign(Source: TPersistent); override;
end;

и проверте результат


 
AkaSaint ©   (2004-02-15 09:52) [4]

Спасибо, все работает! Простые были грабли :-)



Страницы: 1 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.031 c
1-93901
able
2004-02-15 11:48
2004.02.29
Пароли...


11-93828
=Sniper=
2003-06-14 17:07
2004.02.29
Ошибка


1-93989
Невидимка
2004-02-17 11:28
2004.02.29
Хочу перехватить mouse wheel


1-94025
DelphiN!
2004-02-09 21:21
2004.02.29
Ошибка при перехвате ввода с клавиатуры в 9x


7-94215
Эдик
2003-12-08 10:49
2004.02.29
Печать на удаленном принтере