Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.016 c
6-94068
BaMnuP
2003-12-22 05:05
2004.02.29
Помогите с сокетами ! ! ! !


8-94043
Balda
2003-10-29 10:53
2004.02.29
Синтезация речи.


4-94229
Rad
2003-12-23 03:07
2004.02.29
Overlapped IO


1-93960
OlimPer
2004-02-16 22:03
2004.02.29
ShellListView


1-94016
Mishenka
2004-02-15 11:37
2004.02.29
Выбор файлов из одного каталога?




   Наверх