Главная страница
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
4-94225
dima_shapkin
2003-12-24 18:16
2004.02.29
Рамка


7-94222
Sam Stone
2003-12-11 21:03
2004.02.29
Файлы из кэша IE


14-94172
Igor_thief
2004-02-06 16:51
2004.02.29
Tstrings или TstringsList


14-94106
Aldor
2004-02-09 19:49
2004.02.29
Взрывы в Киеве


1-93926
Sour
2004-02-15 12:39
2004.02.29
Координаты, точки в которой щелкнули мышью