Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Вниз
Ошибка при приведении объекта к типу предка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.126 c