Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-93970
semensoft
2004-02-17 14:09
2004.02.29
Изменение размеров jpg


1-94011
Kreon
2004-02-16 20:39
2004.02.29
Отображение русских шрифтов


1-93865
revo
2004-02-16 14:36
2004.02.29
Как отследить двойной щелчок по TShape?


1-93919
Urvin
2004-02-14 21:14
2004.02.29
TScrollBox


6-94048
Jillyusus
2003-12-22 21:29
2004.02.29
Как передать сообщение?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский