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

Вниз

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

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


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

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


 
oxffff ©   (2007-10-09 13:50) [41]


> clickmaker ©   (09.10.07 13:35) [35]
>
> > зачем Borland вводит сущность class function
>
> это понятие не борланд ввел.
> В Си - static
> В VB.Net - shared
> Все дело в инкапсуляции. Если уж мы кодим в рамках ООП,
> так давайте там и оставаться. Иначе, чем это будет отличаться
> от процедурного программирования с использованием некоего
> АПИ?


В .Net вообще отказались от понятия классового метода.
Да и зачем вводить это понятие, если в рамках ООП можно все решить.
Просто ввели тип System.Type, который и выполняет аналогичные функции.

Зачем вводить понятия, если проще делегировать другому типу.
Это действительно разумнее с точки зрения ООП.
Хотя принципиально большой разницы нет.


 
euru ©   (2007-10-09 15:00) [42]


> oxffff ©   (09.10.07 13:50) [41]
> Зачем вводить понятия, если проще делегировать другому типу.
> Это действительно разумнее с точки зрения ООП.
А чем проще и почему разумнее?


 
DiamondShark ©   (2007-10-09 15:08) [43]


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

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


 
DiamondShark ©   (2007-10-09 15:10) [44]


> Зачем вводить понятия, если проще делегировать другому типу.

Действительно, зачем?
Хватило бы процедуры System.New


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


> В .Net вообще отказались от понятия классового метода.


обозвав его словом static и смутив этим неокрепшие умы


 
oxffff ©   (2007-10-09 15:11) [46]


> А чем проще и почему разумнее?


Единообразие.
+см. [19]


 
oxffff ©   (2007-10-09 15:17) [47]


> Игорь Шевченко ©   (09.10.07 15:10) [45]
>
> > В .Net вообще отказались от понятия классового метода.
>
>
>
> обозвав его словом static и смутив этим неокрепшие умы


Для неокрепших умов. :)


Static member functions have external linkage. These functions do not have this pointers. As a result, the following restrictions apply to such functions:
They cannot access nonstatic class member data using the member-selection operators (. or –>).
They cannot be declared as virtual.
They cannot have the same name as a nonstatic function that has the same argument types.


 
Игорь Шевченко ©   (2007-10-09 15:19) [48]

oxffff ©   (09.10.07 15:17) [47]

найди два отличия от классовых методов. (одно известно - виртуальными не могут быть)


 
oxffff ©   (2007-10-09 15:21) [49]


> oxffff ©   (09.10.07 15:17) [47]
>
> > Игорь Шевченко ©   (09.10.07 15:10) [45]
> >
> > > В .Net вообще отказались от понятия классового метода.
>
> >
> >
> >
> > обозвав его словом static и смутив этим неокрепшие умы
>
>
> Для неокрепших умов. :)
>
>
> Static member functions have external linkage. These functions
> do not have this pointers. As a result, the following restrictions
> apply to such functions:
> They cannot access nonstatic class member data using the
> member-selection operators (. or –>).
> They cannot be declared as virtual.
> They cannot have the same name as a nonstatic function that
> has the same argument types.


Это для С++. Промахнулся. Одну секунду.


 
euru ©   (2007-10-09 15:26) [50]


> oxffff ©   (09.10.07 15:11) [46]
> Единообразие.

А поподробнее можно? В чём единообразие?


 
oxffff ©   (2007-10-09 15:31) [51]


> Игорь Шевченко ©   (09.10.07 15:19) [48]
> oxffff ©   (09.10.07 15:17) [47]
>
> найди два отличия от классовых методов. (одно известно -
>  виртуальными не могут быть)


Для .net так же как в С++.

Но назначение и реализация классового (включая виртуальность) метода в delphi и static метода С++\.NET отличается.


 
oxffff ©   (2007-10-09 15:38) [52]


> euru ©   (09.10.07 15:26) [50]
>
> > oxffff ©   (09.10.07 15:11) [46]
> > Единообразие.
>
> А поподробнее можно? В чём единообразие?


Все объекты и даже тип тоже является объектом (точнее объект wrapper).


 
Черный Шаман   (2007-10-09 15:40) [53]


> Ega23 ©   (09.10.07 11:25) [10]
>
>
> > stone ©   (09.10.07 11:22) [8]
> >
> > а если у тебя в юните нет объявления
>
>
> Блин, да я не критикую. По мне так class function - гораздо
> удобнее.
> Просто хотел поинетерсоваться, в чём всё-таки разница, кроме
> того, что class function - суть метод?


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

Полный функционал статических методов/полей класса(типизированные константы) реализован в Delphi начиная только с D2005.

Многие паттерны легко реализуются именно на статических методах.


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

oxffff ©   (09.10.07 15:31) [51]


> Но назначение и реализация классового (включая виртуальность)
> метода в delphi и static метода С++\.NET отличается.


Реализация - безусловно отличается.
Но про отличия назначения давай подробнее аргументов...


 
euru ©   (2007-10-09 16:33) [55]


> oxffff ©   (09.10.07 15:38) [52]

Т.е. вместо
  s := TMyType.ClassName
проще
  System.Type t = typeof(TMyType);
  s = t.Name;

?

А как поступать, если мне понадобится реализовать методы, возвращающие дополнительную информацию о типе?


 
Alkid ©   (2007-10-09 17:13) [56]

Касательно синглтонов и классовых (статических) функций применительно к нему: фишка в том, что в кошерном синглтоне конструктор защищённый и не может быть вызван извне. Без классвойо (статической) функции это реализовать нельзя, ибо обычные функции могут иметь доступ только к публичным конструкторам.


 
Ega23 ©   (2007-10-09 17:26) [57]


> Без классвойо (статической) функции это реализовать нельзя,
>  ибо обычные функции могут иметь доступ только к публичным
> конструкторам.


Лёха, я всё равно не понимаю, в чём принципиальная разница:


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

var
MyClass : TMyClass;

implementation

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


и


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

function GetMyClass : TMyClass;

var
MyClass : TMyClass;

imlementation

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


Даже если
var
MyClass : TMyClass;
в imlementation для каждого куска кода спрятать.


 
clickmaker ©   (2007-10-09 17:31) [58]


> [57] Ega23 ©   (09.10.07 17:26)

точечка + Ctlr+пробел


 
Alkid ©   (2007-10-09 17:32) [59]

Гм. Я тут вспомнил про то, что protected/private в рамках одного юнита не действуют.

Так что в принципиальной разницы нет.


 
Ega23 ©   (2007-10-09 17:32) [60]


> точечка + Ctlr+пробел


Только это и больше ничто?


 
clickmaker ©   (2007-10-09 17:33) [61]


> [60] Ega23 ©   (09.10.07 17:32)

пустячок, а приятно )


 
Ega23 ©   (2007-10-09 17:34) [62]


> Я тут вспомнил про то, что protected/private в рамках одного
> юнита не действуют.


В смысле, наоборот?


 
clickmaker ©   (2007-10-09 17:36) [63]


> [60] Ega23 ©   (09.10.07 17:32)

какая принципиальная разница

GetCurrentDirectory()
GetFileSize()
MakeFullPathName()

vs

Directory.GetCurrent()
File.GetSize()
Path.Combine()

?


 
Ins ©   (2007-10-09 17:37) [64]

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

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

Вторым вариантом такой гибкости не добьешься, если конечно не передавать туда явно классовую ссылку.


 
clickmaker ©   (2007-10-09 17:42) [65]

да, кстати, и это тоже

in the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use Self to access fields, properties, and normal (object) methods, but you can use it to call constructors and other class methods. (с) F1


 
Ins ©   (2007-10-09 17:43) [66]

В общем, отвечая на первоначальный вопрос, "в чем прикол" - в том же, в чем и прикол любого метода по сравнению с обычной функцией/процедурой:
1. Техническая - В параметре Self
2. Идеологическая - в принципах ООП.


 
euru ©   (2007-10-09 17:48) [67]


> Ega23 ©   (09.10.07 17:26) [57]

А если так:

interface

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

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

implementation

var
  MyClass : TMyClass;

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

function TMyClassEx.Init: TMyClass;
begin
  Result := inherited Init;
  DoSomething;
end;


Правда, уже давно не работаю с Delphi, так что, может быть, что-нибудь напутал.


 
euru ©   (2007-10-09 17:49) [68]


> Ins ©   (09.10.07 17:37) [64]
Значит, я что-то ещё помню. :)


 
Ega23 ©   (2007-10-09 17:52) [69]


> Ins ©   (09.10.07 17:37) [64]


О!
Вот теперь ты мне точно всё разжевал. Сыпасибо!


 
Ins ©   (2007-10-09 18:00) [70]

Я кстати по-моему погорячился насчет виртуальности конструктора. А вот Init нужно делать виртуальным, иначе Self может быть не тем, что нужно. Так что у euru © правильнее.


 
Суслик ©   (2007-10-09 18:01) [71]


> 1. Техническая - В параметре Self

не забывай, что не всегда так - в современной дельфи есть с self"ом и без него.


 
clickmaker ©   (2007-10-09 18:03) [72]


> в современной дельфи есть с self"ом и без него

а в военное время - так вообще с двумя :)


 
euru ©   (2007-10-09 18:05) [73]


> clickmaker ©   (09.10.07 18:03) [72]
Т.е. Java изначально создавалась для применения в военное время? :)


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


>  [72] clickmaker ©   (09.10.07 18:03)
> > в современной дельфи есть с self"ом и без него
> а в военное время - так вообще с двумя :)


в современном дельфи class proc совместимо с типом proc of object
а, class proc... static просто с типом proc.

правада фигово эту у них пока работает, но вроде обещали исправить.


 
oxffff ©   (2007-10-09 18:36) [75]


> Игорь Шевченко ©   (09.10.07 16:11) [54]
> oxffff ©   (09.10.07 15:31) [51]
>
>
> > Но назначение и реализация классового (включая виртуальность)
>
> > метода в delphi и static метода С++\.NET отличается.
>
>
> Реализация - безусловно отличается.
> Но про отличия назначения давай подробнее аргументов...


static метод С++\.NET отличается от классового метода Delphi, но идентичен
class static методу Delphi.
Выше я говорил о классовых методах delphi и их назначении.


 
oxffff ©   (2007-10-09 19:02) [76]


>
> euru ©   (09.10.07 16:33) [55]
>
> > oxffff ©   (09.10.07 15:38) [52]
>
> Т.е. вместо
>   s := TMyType.ClassName
> проще
>   System.Type t = typeof(TMyType);
>   s = t.Name;
> ?
>
> А как поступать, если мне понадобится реализовать методы,
>  возвращающие дополнительную информацию о типе?


Итак вернемся к назначению классовых методов delphi (non static) .
Их основное назначение обеспечить доступ к интроспекции.
Если внимательно посмотреть, то все классовые методы, за исключением одного невиртуальные.
Но им нужна была возможность(гибкость) (NewInstance) позволять типу "самому полиморфно инстанцироваться" и пришлось наделить полиморфизмом и метакласс. Именно поэтому и передается в классовый метод ссылка на метакласс. В то время не ввели еще понятие class var.
И поэтому с метаклассом нельзя было связывать поля (ну или почти нельзя ).

НО!!! Если внимательно посмотреть, то фактически метакласс ведет себя как обычный объект у него есть полиморфизм и наследование + сейчас уже добавили опеределять class var (инкапсуляция). За исключением требования существования в единственном экземпляре.

Что касаемо .NET. то такие финты там были не нужны и не предполагались.
Поскольку операции создания и удаления делегированы .NET Runtime .


 
Kolan ©   (2007-10-09 19:17) [77]

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

А чейто такое? :)


 
oxffff ©   (2007-10-09 19:25) [78]


> А чейто такое? :)


RTTI


 
Kolan ©   (2007-10-09 19:27) [79]

Хм&#133 яндекс словари незнают&#133


 
oxffff ©   (2007-10-09 19:34) [80]

Runtime Type Information (RTTI)



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

Форум: "Прочее";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.056 c
15-1192433128
31512
2007-10-15 11:25
2007.11.18
Тестирование программного обеспечения


9-1162551661
megabyte-ceercop
2006-11-03 14:01
2007.11.18
Попинайте дему


15-1192188781
Василий К.
2007-10-12 15:33
2007.11.18
rxlib для Delphi 2007


15-1192094316
YL
2007-10-11 13:18
2007.11.18
VCLSkin + TcxPageControl


15-1192617382
zdm
2007-10-17 14:36
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский