1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| sheka |
3.05.2011 21:32
Сообщение
#1
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: 11 |
Нужно загрузить из файла объект (TTitle) наследник родителя(TPoint).
У родителя есть 2 метода: procedure Load(const Path: string; var fconfig: text); virtual; overload; Реализованы так: procedure TPoint.Load(const Path: string; var fconfig: text); и у наследника: procedure TTitle.Load(const Path: string; var fconfig: text); Проблема в том, что когда в TTitle.Load происходит inherited Load(Path,finfName); далее вызывается TPoint.Load(const Path, FileName: string); который в свою очередь вместо мной желаемого procedure TPoint.Load(const Path: string; var fconfig: text); вызывает полиморфный метод наследника TTitle.Load(const Path: string; var fconfig: text); т.е. теоретически происходит зацикливание, а практически неправильная прочитка файла. Как эту ситуацию обойти? Т.е. чтобы inherited Load(Path,finfName); выполнял только методы родителя или как-то так. |
![]() ![]() |
| IUnknown |
4.05.2011 18:04
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
М-да... Вот тебе как раз и разница между Object/Class...
Цитата(ref.pdf) Classes have virtual methods, just as objects do. There is however a difference between the two. For objects, it is sufficient to redeclare the same method in a descendent object with the keyword virtual to override it. For classes, the situation is different: virtual methods must be overridden with the override keyword. Failing to do so, will start a new batch of virtual methods, hiding the previous one. То есть, что происходит в случае Objects? Метод B.P(string, string) переопределил (override) метод предка A.P(string, string), этого метода A.P(string, string) в принципе нет в экземпляре типа B. Есть только A.P(string, text) и B.P(string, string)... Вот они и вызывают друг друга.В случае классов все по-другому. Поскольку ключевого слова Override произнесено не было - метод B.P(string, string) не переопределил подобный метод из предка, а добавлен к потомку. То есть, существует и один, и второй. И программа работает как ожидается. sheka, а зачем именно Object-ы использовать? Пользуйся классами. Они по крайней мере себя более адекватно ведут. |
sheka Полиморфизм + Перегруженные методы 3.05.2011 21:32
IUnknown Проблема в том, что когда в TTitle.Load происходит... 3.05.2011 23:50
sheka Хм..
Меня интересует чуть [code=pas]{$mode ob... 4.05.2011 14:02
IUnknown Оно никак не будет работать иначе. Ни когда закомм... 4.05.2011 14:44
sheka Исправил, вот:type
A = object
procedure P(co... 4.05.2011 17:25
IUnknown Да, вот с Object-ами вижу зацикливание... Попробую... 4.05.2011 17:35
sheka А откуда тогда она знает когда должно выполняться ... 4.05.2011 19:31
IUnknown В таком случае надо было и приводить код, который ... 4.05.2011 20:15
sheka Уже было :) как раз с Overloadом.
ТР. Так как пишу... 4.05.2011 20:53![]() ![]() |
|
Текстовая версия | 8.12.2025 23:58 |