Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.18;
Скачать: CL | DM;

Вниз

В чём прикол class function?   Найти похожие ветки 

 
Ega23 ©   (2007-10-09 11:05) [0]

И в чём отличие от обычной function? Только то, что первая таки является методом, пусть и неявным?


 
Kolan   (2007-10-09 11:06) [1]

Прикол в том, что обращаешься к классу, имхо
TMyClass.DoSmth&#133


 
Ega23 ©   (2007-10-09 11:08) [2]

Это к вопросу о реализацци паттерна синглтон


 
clickmaker ©   (2007-10-09 11:08) [3]

в том, что не надо экземпляр создавать перед вызовом


 
stone ©   (2007-10-09 11:09) [4]

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


 
Инс ©   (2007-10-09 11:12) [5]

В том, что class function может вызываться без создания экземпляра класса, для того, чтобы, скажем, вернуть некую информацию о классе вцелом, а не его экземпляре. В связи с этим ограничение - в class-function нельзя опрерировать полями/свойствами экземпляра. Вызывать class function можно (не создавая экземпляр) так:
<Имя класса>.<имя функции>

Пример:
TMyClass = class
public
 class function GetVersion: String;
end;

....

class function TMyClass.GetVersion: String;
begin
 Result:="1.01";
end;

Вызов:
Version:=TMyClass.GetVersion;

Классовые методы могут быть виртуальными.


 
Ega23 ©   (2007-10-09 11:17) [6]

Не, это я всё прекрасно знаю и использую.
Просто вот подумалось, в чём отличие от обычной функции?

Ведь я вполне имею право так написать:

type
 TMyClass = class(...)
  public
    procedure DoSomething;
    class function Init : TMyClass;
  end;

var
 MyClass : TMyClass;

function TMyClass.Init : TMyClass;
begin
 if Assigned(MyClass) then Result := MyClass
 else Result := TMyClass.Create;
end;


А могу так:

type
 TMyClass = class(...)
  public
    procedure DoSomething;
  end;

function GetMyClass : TMyClass;

var
 MyClass : TMyClass;

function GetMyClass : TMyClass;
begin
 if Assigned(MyClass) then Result := MyClass
 else Result := TMyClass.Create;
end;


Разницы в вызовах - практически никакой.
Тогда - зачем? Чисто удобства и эстетики ради?


 
clickmaker ©   (2007-10-09 11:21) [7]


> [6] Ega23 ©   (09.10.07 11:17)

второй случай более процедурно-ориентированный, а не ООП. Нарушается понятие инкапсуляции


 
stone ©   (2007-10-09 11:22) [8]

а если у тебя в юните нет объявления
var
MyClass : TMyClass;

что очень часто используется в MDI-приложениях?


 
Суслик ©   (2007-10-09 11:22) [9]

а еще есть class function ... static
так тут в EAX даже ссылка на класс не передается - фактически вызов функции обычной, только под определенным namespace"ом.


 
Ega23 ©   (2007-10-09 11:25) [10]


> stone ©   (09.10.07 11:22) [8]
>
> а если у тебя в юните нет объявления


Блин, да я не критикую. По мне так class function - гораздо удобнее.
Просто хотел поинетерсоваться, в чём всё-таки разница, кроме того, что class function - суть метод?


 
Игорь Шевченко   (2007-10-09 11:25) [11]

прикол в том, что плющит


 
Инс ©   (2007-10-09 11:26) [12]


> Ega23 ©   (09.10.07 11:17) [6]

В подобном случае Борланд предпочитает второй вариант. Модуль Printers тому пример.


> Тогда - зачем?

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


 
Суслик ©   (2007-10-09 11:32) [13]

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


 
DiamondShark ©   (2007-10-09 11:42) [14]


> Это к вопросу о реализацци паттерна синглтон

В паскале этот паттерн реализован на уровне языка.
Юнит -- это и есть синглтон.


 
clickmaker ©   (2007-10-09 11:43) [15]


> в чём всё-таки разница, кроме того, что class function -
> суть метод?

ну вот фрагмент проекта

class function TActorForm.Execute(ActorID: integer; AMode: integer): TModalResult;
var
 AccMode: integer;
begin
 AccMode := GetAccessMode(CLASS_ID_ACTOR);
 if AccMode < 1 then begin
   MessageDialogFmt(E_ACCESS_DENIED, [GetClassTitle(CLASS_ID_ACTOR)],
     IDS_ACCESS_DENIED);
   Result := mrCancel;
   Exit;
 end;
 if AMode > AccMode then AMode := MODE_READ;

 with TActorForm.Create(Application) do begin
   try
     FMode := AMode;
     FActorID := ActorID;

     InitControls;

     Result := ShowModal;
   finally
     Free;
   end;
 end;
end;


преимущества такие:
не создавая формы где-то извне и явно, проверяем доступ. Если его нет, то и форму не создаем.
Можем обращаться к приватным полям класса, разумеется после создания экземпляра
Вся логика по инициализации формы заключена в одном месте.
В месте вызова (а если их много - это особенно актуально) мы пишем всего одну строчку.


 
sdubaruhnul   (2007-10-09 11:47) [16]

>Ega23 ©   (09.10.07 11:17) [6]

>Разницы в вызовах - практически никакой.
Тогда - зачем? Чисто удобства и эстетики ради?


Может быть, ты ещё и глобальные переменные используешь?


 
Инс ©   (2007-10-09 11:49) [17]


> Может быть, ты ещё и глобальные переменные используешь?

Все используют, Application, DecimalSeparator...


 
Ega23 ©   (2007-10-09 11:51) [18]


> Может быть, ты ещё и глобальные переменные используешь?


Да. А что?


 
oxffff ©   (2007-10-09 11:54) [19]

Самое интересное, что конструктор не является в чистом виде ни class и ни instance методом. В зависимости от dl он приобретает,  то один, то другой вид.


 
oxffff ©   (2007-10-09 12:01) [20]


> В чём прикол class function?


Классовые методы - это методы для работы с типом.
Фактически это методы для работы с интроспекцией


 
Суслик ©   (2007-10-09 12:02) [21]


> интроспекцией

вау


 
oxffff ©   (2007-10-09 12:09) [22]


> Суслик ©   (09.10.07 12:02) [21]
>
> > интроспекцией
>
> вау


+ см. [19].

Интроспекция

   class function InitInstance(Instance: Pointer): TObject;
   class function ClassName: ShortString;
   class function ClassNameIs(const Name: string): Boolean;
   class function ClassParent: TClass;
   class function ClassInfo: Pointer;
   class function InstanceSize: Longint;
   class function InheritsFrom(AClass: TClass): Boolean;
   class function MethodAddress(const Name: ShortString): Pointer;
   class function MethodName(Address: Pointer): ShortString;
   class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
   class function GetInterfaceTable: PInterfaceTable;
   class function NewInstance: TObject; virtual;

.NET System.Type + activators не напоминает


 
DiamondShark ©   (2007-10-09 12:37) [23]


> .NET System.Type + activators не напоминает

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


 
oxffff ©   (2007-10-09 12:58) [24]


> DiamondShark ©   (09.10.07 12:37) [23]
>
> > .NET System.Type + activators не напоминает
>
> В том-то и дело, что предоставлять информацию о типах и
> реализовывать операции по инстанцированию -- это задача
> операционной среды.
> Классовые функции не являются для этого необходимыми.


Посмотри реализацию _ClassCreate.


 
DiamondShark ©   (2007-10-09 13:08) [25]


> Посмотри реализацию _ClassCreate.

Зачем?


 
homm ©   (2007-10-09 13:11) [26]

> [0] Ega23 ©   (09.10.07 11:05)
> И в чём отличие от обычной function?
> [5] Инс ©   (09.10.07 11:12)
> В том, что class function может вызываться без создания экземпляра класса

Гениально. Видимо обычной function вызвать без создания экземпляра класса нельзя? :(


 
Ega23 ©   (2007-10-09 13:13) [27]


> Гениально. Видимо обычной function вызвать без создания
> экземпляра класса нельзя? :(


Имелось ввиду TMyClass.Init
Ну, короче, кому надо - тот понял...


 
homm ©   (2007-10-09 13:16) [28]

> [27] Ega23 ©   (09.10.07 13:13)

подожди, ты спрашивал отличия «class function» от «обычной function» или все-же от функции-члена?


 
Kolan ©   (2007-10-09 13:17) [29]

> Юнит &#151;&#151; это и есть синглтон.

Это коннечно не так по определению синглетона.


 
Skyle ©   (2007-10-09 13:20) [30]


> Kolan ©   (09.10.07 13:17) [29]
> > Юнит —— это и есть синглтон.
> Это коннечно не так по определению синглетона.

А от какого определения отталкиваемся?


 
oxffff ©   (2007-10-09 13:20) [31]


> DiamondShark ©   (09.10.07 13:08) [25]
>
> > Посмотри реализацию _ClassCreate.
>
> Зачем?


Для просветления.

>это задача операционной среды
что это? Где такое в Delphi?
В .NET такое по другому называется.

>В том-то и дело, что предоставлять информацию о типах и реализовывать >операции по инстанцированию

Классовые методы выполняют операции связанные с типом. В том числе предоставляют информацию о типе.

>Посмотри реализацию _ClassCreate.
>Зачем?

Чтобы узнать что для инстанцирования типа используется информация связанная с типом, которая предоставляется классовыми методами.


 
Ins ©   (2007-10-09 13:25) [32]


> Ну, короче, кому надо - тот понял...

Действительно первый раз не правильно понял, было очень похоже, что под "обычным function" подразумевается обычный метод, а не классовый. Разница же между методом и обычной функцией (что автору и нужно было на самом деле) в том, что в метод неявно передается еще один параметр - self. Вот только для instance-методов и class-методов смысл этого параметра разный. В первом случае - указатель на экземпляр, во втором - указатель на информацию о типе класса.


 
Ega23 ©   (2007-10-09 13:32) [33]


> Разница же между методом и обычной функцией (что автору
> и нужно было на самом деле) в том, что в метод неявно передается
> еще один параметр - self. Вот только для instance-методов
> и class-методов смысл этого параметра разный. В первом случае
> - указатель на экземпляр, во втором - указатель на информацию
> о типе класса.


Мне не это надо было. Разницу между обычной функией(процедурой) и методом я знаю. Про Self - мне тоже известно.
Просто интересно было: зачем Borland вводит сущность class function, если она реально ничем не отличается от простой функции, кроме как наличием этого самого Self?

Короче, просто любопытство.


 
Ega23 ©   (2007-10-09 13:33) [34]


> Вот только для instance-методов и class-методов смысл этого
> параметра разный. В первом случае - указатель на экземпляр,
>  во втором - указатель на информацию о типе класса.


О! Вот, собственно, это я и хотел услышать.
Теперь всё ясно. Вопрос снят.


 
clickmaker ©   (2007-10-09 13:35) [35]


> зачем Borland вводит сущность class function

это понятие не борланд ввел.
В Си - static
В VB.Net - shared
Все дело в инкапсуляции. Если уж мы кодим в рамках ООП, так давайте там и оставаться. Иначе, чем это будет отличаться от процедурного программирования с использованием некоего АПИ?


 
Kolan ©   (2007-10-09 13:35) [36]

> Вопрос снят.

Имхо Borland ввел её для поддержки ООП. Возможно даже, чтобы генерить паттерн синглетон одинаковый в Net и в Win32&#133


 
oxffff ©   (2007-10-09 13:39) [37]


> Ega23 ©   (09.10.07 13:33) [34]
>
> > Вот только для instance-методов и class-методов смысл
> этого
> > параметра разный. В первом случае - указатель на экземпляр,
>
> >  во втором - указатель на информацию о типе класса.
>
>
> О! Вот, собственно, это я и хотел услышать.
> Теперь всё ясно. Вопрос снят.


А ведь хотел я на help указать. :)


 
Ins ©   (2007-10-09 13:40) [38]


> Просто интересно было: зачем Borland вводит сущность class
> function, если она реально ничем не отличается от простой
> функции, кроме как наличием этого самого Self?

Отличается. Возможностью делать такие методы виртуальными. Тут уже без Self никак не обойтись.


 
Ega23 ©   (2007-10-09 13:41) [39]


> А ведь хотел я на help указать. :)


Да смотрел я, только видать не понял, или проглядел...


 
Ins ©   (2007-10-09 13:41) [40]


> О! Вот, собственно, это я и хотел услышать.

Блин, ты уж определись, известно тебе про Self или не известно :)



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2007.11.18;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.024 c
15-1192431257
KSergey
2007-10-15 10:54
2007.11.18
Миллионер Марк Шаттлворт ... выпускает массовый ноутбук (250$)


2-1193222683
Riply
2007-10-24 14:44
2007.11.18
Префикс ?? в файловых путях


15-1191982209
Slider007
2007-10-10 06:10
2007.11.18
С днем рождения ! 10 октября 2007 среда


2-1193126277
Sergey2
2007-10-23 11:57
2007.11.18
длина строки в пикселях


2-1193493258
antonn
2007-10-27 17:54
2007.11.18
вызов процедуры по адресу