Главная страница
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.019 c
6-94056
mix.4ever
2003-12-05 12:31
2004.02.29
Удаленный десктоп


3-93810
bobsan
2004-02-03 13:54
2004.02.29
Физическое удаление записей (pack)


8-94046
OlBan
2003-10-28 07:15
2004.02.29
MMTools и mp3


8-94029
GIL
2003-10-28 11:11
2004.02.29
DoubleBuffered


3-93790
Zilog
2004-02-03 17:32
2004.02.29
Как во время выполнения проги создать в БДЕ таблицу с ЗАДАННЫМ