Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];

Вниз

В чём прикол 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.119 c
2-1193247805
Б. Гейтс
2007-10-24 21:43
2007.11.18
Массив - как организовать? (без array и на АПИ)


15-1192089524
Vlad Oshin
2007-10-11 11:58
2007.11.18
Проблема с cgi с IIS 6.0.


2-1193612598
Dmitry_177
2007-10-29 02:03
2007.11.18
перевести TTime в количество секунд


8-1169458164
efremovnd
2007-01-22 12:29
2007.11.18
работа с графикой


2-1192859788
Kolan
2007-10-20 09:56
2007.11.18
Как при сворачивании модальной формы свернуть все приложение?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский