function и class function - в чём разница?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

function и class function - в чём разница?

Сообщение vitaly_l » 23.03.2013 15:03:42

Есть:
function ...
procedure ...

А есть:
class function ...
class procedure ...

:?: Приставка class - для чего нужна и предназначена?
:?: Какие привилегии даёт приставка class ?


PS: Заранее благодарен каждому за каждый информативный ответ.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение Sergei I. Gorelkin » 23.03.2013 15:45:50

Обычные методы (без приставки class) работают с экземплярами класса. Методы класса работают с самим классом, это значит:
- Неявный параметр self является не указателем на экземпляр, а тем, что возвращает classtype.
- Нельзя обращаться к полям, но можно обращаться к полям класса (те, что объявлены как class var ...).
- Нельзя вызывать обычные методы, но можно вызывать методы класса и конструкторы.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: function и class function - в чём разница?

Сообщение vitaly_l » 23.03.2013 16:03:20

Sergei I. Gorelkin писал(а):- Неявный параметр self является не указателем на экземпляр, а тем, что возвращает classtype.
- Нельзя обращаться к полям, но можно обращаться к полям класса (те, что объявлены как class var ...).
- Нельзя вызывать обычные методы, но можно вызывать методы класса и конструкторы.


С одной стороны спасибо за ответ, с другой:
Ого.., как сложно интерпретировать Ваше объяснение.

Что вы называете, понятием: неявный параметр - это self? Указателем на экземпляр?
Что Вы называете полями? А что полями класса? (В коде - ничего не объявлено как class var...)
Что Вы называете обычными методами? А что методами класса?

Очень много незнакомых понятий - сложно интерпретировать.
Если не составит тяжкий труд, раскройте более доступно - пожалуйста.
Если можно на простых примерах?


.

ClassType возвращает действительный тип объекта, а не просто его имя, как это делает ClassName. В отличие от Classlnfo, ClassName и ClassParent, ClassType оперирует объектами (экземплярами класса), а не классами (типами объектов). ClassType возвращает информацию, подобную возвращаемой оператором is. Фактически операторы is и as сами вызывают ClassType.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение Sergei I. Gorelkin » 23.03.2013 16:51:52

Процедуры и функции, объявленные внутри объявления класса, называются методами. Переменные, объявленные внутри объявления класса, называют полями.
К обычной процедуре/функции дописать в начало "class" нельзя. Это можно сделать только с методом. Получится "метод класса" (те самые class procedure или class function). Аналогично с полями, только надо приписывать не "class", а "class var".
Далее, метод отличается от обычной процедуры или функции тем, что в него передается скрытый (неявный) параметр "self". Значение этого параметра разное для "обычных" методов и "методов класса".
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: function и class function - в чём разница?

Сообщение vitaly_l » 23.03.2013 17:36:16

Теперь немного более понятно, чем прежде. Спасибо.
Однако, вот здесь всё ещё путаница идентификации:
Sergei I. Gorelkin писал(а):Значение этого параметра разное для "обычных" методов и "методов класса".

Или иначе Вашу фразу нужно записать так:
Значение self разное для: class методов (функций/процедур) и методов. <= так правильно я понимаю?

И ещё при class появляется дополнительные поля(переменные), объявляемые class var SomeName;
А зачем? Чем они отличаются от глобальных переменных(полей)?

из справочника писал(а):Переменная Self скрытый параметр для каждого метода в объекте. Он позволяет методу обратиться к объекту.

А что обозначает Self для (class методов)?



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение Sergei I. Gorelkin » 23.03.2013 17:55:07

vitaly_l писал(а):Или иначе Вашу фразу нужно записать так: Значение self разное для: class методов (функций/процедур) и методов. <= так правильно я понимаю?

Можно и так записать.
vitaly_l писал(а):И ещё при class появляется дополнительные поля(переменные), объявляемые class var SomeName; А зачем? Чем они отличаются от глобальных переменных(полей)?

Да по сути ничем, разве что можно ограничить их видимость извне класса, в котором они объявлены.

vitaly_l писал(а):А что обозначает Self для (class методов)?

Сам класс (значение, возвращаемое методом ClassType).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: function и class function - в чём разница?

Сообщение vitaly_l » 23.03.2013 18:27:04

Спасибо.
Более менее - понял.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение VirtUX » 24.03.2013 00:26:08

методы, объявленные как class procedure/function можно вызывать до вызова конструктора самого класса. Т.е. доступа к обычным методам до конструктора нет, до class-методов доступ есть.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: function и class function - в чём разница?

Сообщение vitaly_l » 24.03.2013 00:31:44

VirtUX писал(а):Т.е. доступа к обычным методам до конструктора нет, до class-методов доступ есть.

:?: И к полям(переменным), тоже можно обратиться до вызова конструктора самого класса?
:arrow: Спасибо.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение alexey38 » 24.03.2013 07:00:34

vitaly_l писал(а):И к полям(переменным), тоже можно обратиться до вызова конструктора самого класса?

класс переменные (поля) - это по сути обычные глобальные переменные, но при обращении к которым нужно указать название класса + точку + название поля. А для глобальной переменной мы при обращении указываем просто имя переменной.
класс функции (методы) - это по сути обычные функции, объявленные в модуле, но при обращении к которым нужно указать название класса + точку + название метода. А для обычной функции мы при обращении указываем просто имя функции.
Соответственно конструкторы, деструкторы, создание экземпляра класса, наличие указателя на класс - это все не участвует в работе класс методов и класс полей.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: function и class function - в чём разница?

Сообщение vitaly_l » 24.03.2013 11:31:10

alexey38 писал(а):конструкторы, деструкторы, создание экземпляра класса, наличие указателя на класс - это все не участвует в работе класс методов и класс полей; при обращении к которым нужно указать название класса + точку + название

:P Спасибо - идентифицировал :cry:

Поймите правильно: я программист-инопланетянин, у меня на корабле вышел из стоя модуль запуска межгалактического двигателя. Нужных деталей нет и я решил использовать компьютеры с планеты Земля. Но для этого мне нужно понять как они работают и как их запрограммировать?

С функциями - можно представить ситуацию, когда возможность предоставляемая class функциями будет востребована... Например, когда нужно использовать: расчёт нормалей, межгалактического пути или пересчёт матриц, или обработать string функцией из класса - безотносительно к буферам этого класса.

А как можно использовать переменные(поля) класса, если их заполнить до create - то..., то что в них записано, сохраняется после inherited Create;?
:?: Для чего могут понадобиться(предназначены) class var поля?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: function и class function - в чём разница?

Сообщение alexey38 » 24.03.2013 11:54:13

vitaly_l писал(а):А как можно использовать переменные(поля) класса, если их заполнить до create - то..., то что в них записано, сохраняется после inherited Create;?
Для чего могут понадобиться(предназначены) class var поля?

Я Вам уже писал "класс переменные (поля) - это по сути обычные глобальные переменные, но при обращении к которым нужно указать название класса + точку + название поля. А для глобальной переменной мы при обращении указываем просто имя переменной."

Это обычные глобальные переменные, т.е. тоже самое, что Вы пишите в Var i:integer; Назначение и все правила работы с "class var" аналогичны просто "var".
Класс функции и класс поля придуманы только для того, чтобы попытаться как-то сгруппировать некоторые глобальные переменные, и функции с неким общим названием.

Вот Вы в программе объявили Var i,j.k:integer; И объявили функции proc1, proc2, proc3. Что и для чего без комментариев будет непонятно.
Если Вы объявите
Код: Выделить всё
Type
XXX=class
class var i:integer;
class procedure proc1();
end;

То тем самым показываете некую смысловую взаимосвязь переменной i и функции Proc1. Вам для обращения нужно будет писать "XXX.i" и "XXX.Proc1".

То есть на функционал это не влияет, но это позволяет повысить читабельность. Совмещение в одном классе обычных полей и класс полей, обычных функций и класс функций не рекомендуется без особой необходимости, чтобы не путать и не вводить в заблуждение.

Мы недавно обсуждали про модули, секции инициализации, финализации. Те кто много пишет глобальных переменных, много пишет функций вне классов и знают для чего это нужно, и при этом избегают создание классов без нужды, те как раз широко используют класс функции и класс переменные, чтобы не создавай классов, не ввязываясь в ООП, несколько структурировать свою программу.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: function и class function - в чём разница?

Сообщение absdjfh » 24.03.2013 11:58:56

Для чего могут понадобиться(предназначены) class var поля?

Предполагаю, что примерно для того же, что и типизированная константа в процедурах. Это - некоторая характеристика всего класса объектов, присущая одновременно всем объектам, а не отдельному экземпляру. Может применятся как средство некого "общения" между ними.
-/-
Для наглядности прошу обратить внимание на эти функции класса Tobject
class function ClassType : tclass;
class function ClassInfo : pointer;
class function ClassName : shortstring;
Если изучить их реализацию, то видно, что они используют ссылку Self как ссылку на таблицу VMT.
Подскажите, правильно ли я понял, что class function применяются:
1) для наглядности в тех случаях, когда функция работает с классом и относится к нему по смыслу, но не работает с конкретным экземпляром, и
2) для извлечения информации о классе непосредственно из VMT?
Или их можно применять как-то еще?
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: function и class function - в чём разница?

Сообщение alexey38 » 24.03.2013 12:07:30

absdjfh писал(а):Или их можно применять как-то еще?

Когда нет ни одного экземпляра класса, и не предполагается. А требуется просто систематизировать глобальные переменные и функции. То есть как техника обычного процедурного программирования.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: function и class function - в чём разница?

Сообщение absdjfh » 24.03.2013 12:17:31

Когда нет ни одного экземпляра класса, и не предполагается. А требуется просто систематизировать глобальные переменные и функции. То есть как техника обычного процедурного программирования.

А разве просто отдельный модуль для такого случая не будет более наглядным? Впервые о таком способе слышу...
Придумал наглядный пример применения class var:
Пусть есть класс THuman. Пусть его поведение зависит от другого класса, который объявлен для наглядности его полем - class var Pr: TPresident.
Далее состояние поля Pr изменилось. Тогда должно измениться поведение одновременно всех THuman, а не отдельно взятых экземпляров этого класса, т. к. Pr у всех одинаковый. Pr можно было бы объявить как глобальную переменную, но если она предназначена только для одного класса, а другим она не нужна, то использование ее внутри класса нагляднее.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru
cron