![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Keeper89 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
Доброго времени суток.
Имеется 4 класса:
Т.е. родительский A, имеет 2 дочерних B и С, а B в свою очередь имеет свои 2 дочерних. В A имеется следующий абстрактный метод:
реализуемый только в B1, B2 и C, в B он остается абстрактным для реализации в дочерних классах. --- Проблема в следующем. Класс A содержит процедуру:
который ссылается на реализованный Valid в потомках. При попытке добавить записать (вызвать Add) у классов B1, B2 выскакивает EAbstractError, хотя в B1 и B2 метод Valid имеется. --- Вот, в чем может быть ошибка? |
||||||
|
|||||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Забыли override?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
в B1, B2 и C override стоит:
в B объявление такое же как и в A. Это сообщение отредактировал(а) Keeper89 - 13.10.2009, 15:57 |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Возможно криво создали класс.
Конструктор виртуальный? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Присоединяюсь. Похоже что создан экземпляр с абстрактным методом.
-------------------- Обижено школьников: 8 |
|||
|
||||
Keeper89 |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
CodeMonkey,
bems, если я правильно понял - как раз это я и сделал. Классы по очереди: A:
B:
B1,B2:
C:
Это сообщение отредактировал(а) Keeper89 - 13.10.2009, 22:42 |
||||||||
|
|||||||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
ааа.
Так у тебя B.Valid скрывает A.Valid. В В1 и В2 ты перекрываешь скрывающий из B, а самый первый из А так и остается абстрактным. И он же вызывается. Ты что хотел этим добиться? Если я правильно понял, нужно убрать объявление из В -------------------- Обижено школьников: 8 |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
В каждом дочернем классе я хотел сделать свой метод проверки Valid (в B1, B2 и C), в родителях же он просто декларируется. В этом случае просто убрать абстрактное объявление Valid в B? Может можно еще что-то улучшить в структуре классов? Это сообщение отредактировал(а) Keeper89 - 13.10.2009, 23:21 |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
ну да. А разве компилятор ворнинга не выдал?
ну если у потомков будут добавляться новые свойства то наверное Assign должен тоже быть виртуальным -------------------- Обижено школьников: 8 |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
имхо
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
bems, все получилось, спс!
Выдавал, я не заметил: [DCC Warning] W1010 Method 'Valid' hides virtual method of base type 'A'
Учту, хотя вряд ли будут еще дочерние классы. Исходя из исправления вопрос: получается, что виртуально-абстрактный метод реализуется только в последнем дочернем классе, а во всех остальных кроме базового даже не декларируется? |
|||
|
||||
bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
||||
|
|||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
bems, ок, спасибо!
З.Ы. Assign пока не менял, в потомках он не переопределяется. Это сообщение отредактировал(а) Keeper89 - 14.10.2009, 20:55 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |