Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 221
от 23.12.2003, 10:40

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 388
Отправлено ответов: 1376
Активность: 354.6 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

_vt
Статус: Профессиональный
Общий рейтинг: 118.91
[Подробней >>]
Boriss
Статус: Опытный
Общий рейтинг: 149.66
URL: Программирование на Паскале
[Подробней >>]
sir henry
Статус: Профессиональный
Общий рейтинг: 161.53
[Подробней >>]
 
Drahus
Статус: Опытный
Общий рейтинг: 167.3
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 377. Мы с тобой одной крови! Дело в следующем: Type TProcedure=Procedure; TFunction=Functi... (ответов: 4)
Вопрос № 378. To _Vt: Доброй ночи! Я сейчас уже соображаю туго, но... 1) То что я сделал, разве не иерархия?! TFBu... (ответов: 4)

Вопросов: 2, ответов: 8


 Вопрос № 377

Мы с тобой одной крови!
Дело в следующем:
Type TProcedure=Procedure;
TFunction=Function:boolean;
Tbutton=object
private
a:TProcedure;Virtual;{Здесь, после слова Virtual, компилятор требует указать тип. Если указать что то типа :byte - все нормально. Почему это и для чего оно?}
public
Procedure ButtonPressed;Virtual;{Здесь указание типа не требуется...}
end;
TFButton=object(TButton)
private
a:TFunction;{Это не прокатывает. Говорит, что переменная с таким именем уже существует.}
end
Но, вот выдержка из справки: Объявление метода виртуальным делает возможным для МЕТОДОВ С ТЕМ ЖЕ ИМЕНЕМ выполнение различными способами внутри иерархии объектных типов.
Может я что-то не догоняю? Кто нибудь знает в чем дело?
ЗЫ: Borland Pascal 7



Вопрос отправлен: 19.12.2003, 19:30
Отправитель: Vitally

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Здравствуйте, Vitally!
Мы с тобой не только одной крови, но еще и тезки! :-)
Ты немного не так понимаешь - в паскале не реализовано объявление методов объекта с одинаковым именем, но разных типов - в дельфи для этого есть ключевое слово overload. А виртуальные методы - это такие методы, которые должны перекрываться потомками объекта - в твоем случае, у объекта Tbutton есть виртуальный метод, но он не должен быть реализован - его реализация будет различаться у его потомков - например, у твоего объекта TFButton будет своя реализация этого метода, а если создашь другой объект-потомок от TButton, к примеру TSuperButton - его методы, объявленные у родителя виртуальными, будут реализованы по-своему. Вот об этом и написано в справке - там же написано "Внутри ИЕРАРХИИ.объектов", а не внутри одного объекта!

*** E-Man - can help you***


Ответ отправлен: 19.12.2003, 21:29
Отправитель: _vt


Отвечает Boriss

Здравствуйте, Vitally!
Ваш пример - это что-то вроде надевания штанов через голову :))
Неясно, зачем использовать TProcedure в объектах - там реализуется иной подход к "изменению" содержимого процедуры.
Механизм виртаульных методов объектов делает бессмысленным (или лучше, ничем не оправдываемым) использование процедурных типов
Обычно поступают по-иному (см. в приложении)


Приложение:

Ответ отправлен: 22.12.2003, 11:02
Отправитель: Boriss


Отвечает sir henry

Доброе время суток, Vitally!
Может быть стоит прислушиваться к тому, что говорит компилятор? :)
1. Виртуальными могут быть методы, но никак не поля объекта. А у Вас поле, хоть и процедурного типа, но все-таки поле.
2. Не делайте в объекте-потомке поле с тем-же названием.
--
В приложении код, который правильный.

Приложение:

Ответ отправлен: 20.12.2003, 04:03
Отправитель: sir henry


Отвечает Drahus

Приветствую Вас, Vitally!Вообще-то с ООП я начал разбираться только сегодня. Так что ничего точно сказать не могу.
У меня вопрос. ( :)
Type TProcedure=Procedure; a:TProcedure; - не знаком с такой записью. Это значит 'a' - процедура? Если да, то не знаю что у вас не работает. Если же 'a' определяется не как процедура, то и вправду такая запись неверная. Я вот вычитал что методами называются процедуры и функции. А 'a' не является таковой.
И ещё.
>a:TProcedure;Virtual;{Здесь, после слова Virtual, компилятор требует указать тип. Если указать что то типа :byte - все нормально. Почему это и для чего оно?}
А зачем тут вообще Virtual? Это же самый первый обьект. Без Virtual ничего указывать не нужно.


Ответ отправлен: 21.12.2003, 01:03
Отправитель: Drahus


 Вопрос № 378

To _Vt:
Доброй ночи!
Я сейчас уже соображаю туго, но...
1) То что я сделал, разве не иерархия?! TFButton являтся потомком от TButton...
2)С этим я разобрался. Никакой Overload на ... не нужен. Просто создаем потомок в другом модуле и можно создовать методы с тем же именем, но другими параметрами.
3) Меня больше интересует - зачем эта ... требует указать тип и что/как/в каком случае я должен указывать.
4) т.е. Overload означает - не используется в данном классе?
ЗЫ: Спасибо!:)



Вопрос отправлен: 19.12.2003, 21:55
Отправитель: Vitally

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Здравствуйте, Vitally!
Я не опоздал ? :-)
1) Да, так и есть.
2) И в этом модуле можно.
4) Ты может перепутал? Имел в виду virtual? Это слово означает, что этот метод потомок обязан перекрыть своим.

* Origin: Эй, еж? Тебе понятно?

E-Man 1.5+ on Windows XP SP1


Ответ отправлен: 22.12.2003, 20:00
Отправитель: _vt


Отвечает Boriss

Добрый день, Vitally!
4) Overload - это добавлено в механизме наследования в Object Pascal (который в Delphi)
1) То, что Вы сделали - это точно НЕ ИЕРАРХИЯ - Вы, как Вам отвечали, хотите сделать ВИРТУАЛЬНЫМ ПОЛЕ !!! (а можно только МЕТОДЫ)
2) "методы с таким же именем, но с другими параметрами" - надо уточнить Вы в чем пишете? В BP? В Delphi? (по номеру судя - в BP)

Ответ отправлен: 22.12.2003, 11:09
Отправитель: Boriss


Отвечает sir henry

Приветствую Вас, Vitally!
4. Overload - всего навсего обозначает, что есть несколько ФУНКЦИЙ или МЕТОДОВ, которые имеют одно и тоже название, но обрабатывает параметры различных типов.

Ответ отправлен: 20.12.2003, 04:14
Отправитель: sir henry


Отвечает Drahus

Добрый день, Vitally!
Я был не прав в прошлом ответе?
>зачем эта ... требует указать тип и что/как/в каком случае я должен указывать.
Не знаю. Не писать Virtual в первом обьекте.


Ответ отправлен: 21.12.2003, 01:04
Отправитель: Drahus



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (26)
C / C++ (18)
Perl (4)
Builder / Delphi (20)
Pascal (22)
Basic / VBA (3)
Java / JavaScript (5)
PHP (11)
Криптография (9)
WinAPI (12)
Пользователю
Windows 95/98/Me (34)
Windows NT/2000/XP (49)
"Железо" (25)
Поиск информации (18)
Администратору
Windows NT/2000/XP (27)
Linux / Unix (15)
Юристу
Гражданское право (12)
Семейное право (8)
Трудовое право (9)
КоАП (8)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное