Форум: "Прочее";
Текущий архив: 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
…
← →
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]> Юнит —— это и есть синглтон.
Это коннечно не так по определению синглетона.
← →
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…
← →
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