Мы с тобой одной крови! Дело в следующем: 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
Здравствуйте, 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 означает - не используется в данном классе? ЗЫ: Спасибо!:)
Здравствуйте, 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.