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

Вниз

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

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

Runtime Type Information (RTTI)


 
vpbar   (2007-10-09 21:15) [81]

>>clickmaker ©   (09.10.07 11:21) [7]
А как вам такое мнение.
http://www.softcraft.ru/coding/sm/sm02.shtml
И о том что есть инкапсуляция можно пофилософствовать.

>>[0]
Не совсем понял вопрос, но отвечу на оба.
Есть код:

 TMyClass = class(Tobject)
 public
   FInt:Integer;
   class function Init: TMyClass; virtual;
   class procedure DoSomething;
   procedure DoSomethingNoClassMethod;
   class procedure CallInit;
 end;

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

 TMyClasses=class of TMyClass;
.......................

{ TMyClass }
class procedure TMyClass.CallInit;
begin
 ShowMessage("TMyClass.CallInit");
 Init; // вызов виртуального метода класса. будет зависеть от self
end;

class procedure TMyClass.DoSomething;
begin
ShowMessage("TMyClass.DoSomething "+Self.ClassName);
end;

procedure TMyClass.DoSomethingNoClassMethod;
begin
ShowMessage("TMyClass.DoSomethingNoClassMethod "+Self.ClassName);
end;

class function TMyClass.Init: TMyClass;
begin
result:=Self.Create;
ShowMessage("TMyClass.Init "+Self.ClassName);
end;

{ TMyClassEx }

class procedure TMyClassEx.DoSomething;
begin
ShowMessage("TMyClassEx.DoSomething "+ClassName);
end;

class function TMyClassEx.Init: TMyClass;
begin
ShowMessage("TMyClassEx.Init inherited Init");
Result := inherited Init;
ShowMessage("TMyClassEx.Init "+Self.ClassName);
end;

Чем отличается class method от процедуры. Только тем что метод класса может быть виртуальным.
Например

  c:=TMyClass;
 // вызов class function init который возвращает экземпляр класса
 // c.Init;
  // вызов funciton init который возвращает экземпляр класса
  // отличий в логике почти нет
 // Init(c);


но следующий вариант с помощью процедур трудно реализовать
 
  c:=TMyClass;
  c.CallInit; // в CallInit вызывается метод Init класса TMyClass
  c:=TMyClassEx;
  c.CallInit;// в CallInit вызывается метод Init класса TMyClassEx


Невиртуальные методы класса по сути не отличаются от процедуры которой передается указатель на информацию о типе класса (Self:class of TMyClass)

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


 
vpbar ©   (2007-10-09 21:34) [82]

>>Черный Шаман   (09.10.07 15:40) [53]
Вроде в некоторой степени статические поля класса можно эммулировать так;
......
class function TMyClass.StaticField(value:integer=0;get:boolean=true): integer;
{$WRITEABLECONST ON}
const fStaticField:integer=0;
{$WRITEABLECONST OFF}
begin
result:=fStaticField;
if not get then  fStaticField:=value;
end;
....
 c.StaticField(10,false); // присваиваем 10
 ShowMessage(inttostr(c.StaticField())); // получаем назад

Длинно, но я думаю потребность в таком редкая и это мелочи.


 
euru ©   (2007-10-10 10:32) [83]


> oxffff ©   (09.10.07 19:02) [76]
Я правильно понял, что отказ от методов класса упрощает жизнь разработчикам языка программирования, а не использующим его программистам? Или всё-таки такой отказ даёт некие преимущества при программировании?


 
oxffff ©   (2007-10-10 10:53) [84]


> euru ©   (10.10.07 10:32) [83]
>
> > oxffff ©   (09.10.07 19:02) [76]
> Я правильно понял, что отказ от методов класса упрощает
> жизнь разработчикам языка программирования, а не использующим
> его программистам? Или всё-таки такой отказ даёт некие преимущества
> при программировании?


Нет. Не правильно.
Я лишь говорил о связи классовых методов Delphi (non static) и .NET System.Type.
То что нельзя расширить определить полиморфные методы над самим типом .NET я не готов ответить плюс это или минус. Но это факт.
Но наличие такой возможности в Delphi - это безусловно плюс.
Думаю изначально разработчики Delphi ввели виртуальные классовые методы лишь для поддержки NewInstance.

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

Если необходимо связать полиморфную операцию с семейством типов, тогда конечно классовый метод это решение. Один пример это NewInstance.
Но честно говоря, какую еще информацию можно связать с семейством типов.
Привидите конкретный пример.


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

oxffff ©   (09.10.07 18:36) [75]


> Выше я говорил о классовых методах delphi и их назначении.


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


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


> Игорь Шевченко ©   (10.10.07 10:58) [85]
> oxffff ©   (09.10.07 18:36) [75]
>
>
> > Выше я говорил о классовых методах delphi и их назначении.
>
>
>
> Давай ты уже расскажешь именно о различии в назначении или
> приведешь номер поста, где рассказл.


Delphi

Ordinary Class Methods - Self represents the class
Class Static Methods - no Self parameter at all.

.NET  (ECMA-335)

Similarly, types can also declare methods that are associated with the type rather than with values of the type.
Such methods are static methods of the type. Since an invocation of a static method does not have an
associated value on which the static method operates, there is no this pointer available within a static method.

Поэтому

class static метод Delphi является аналогом static method .NET

Назначение Ordinary class method является доступ к интроспекции типа + полиморфные операции типа-определение способа размещения экземпляра типа.

C чем не согласны?


 
oxffff ©   (2007-10-10 11:23) [87]


> То что нельзя расширить определить полиморфные методы над
> самим типом .NET я не готов ответить плюс это или минус.
>  Но это факт.


Их конечно можно определить, но прямого способа их определения нет.


 
Игорь Шевченко ©   (2007-10-10 12:00) [88]

oxffff ©   (10.10.07 11:15) [86]


> C чем не согласны?


С обоими (с)

Я согласен с тем, что методы класса и в .Net и в .Delphi предназначены для работы с метаданными объекта или как аналог обычных процедур/функций в языке, где кроме классов ничего нету (C#, Java, может быть, что-то еще).


 
oxffff ©   (2007-10-10 12:14) [89]


> Игорь Шевченко ©   (10.10.07 12:00) [88]
> oxffff ©   (10.10.07 11:15) [86]
>
>
> > C чем не согласны?
>
>
> С обоими (с)
>
> Я согласен с тем, что методы класса и в .Net и в .Delphi
> предназначены для работы с метаданными объекта или как аналог
> обычных процедур/функций в языке, где кроме классов ничего
> нету (C#, Java, может быть, что-то еще).


Xм.
А как вы собираетесь работать с метаданными класса в .NET используя static метод класса, который фактически является regular proc c ограниченным scope до static class fields,methods.
Для этого и есть System.Type.


 
isasa ©   (2007-10-10 15:55) [90]

oxffff ©   (10.10.07 12:14) [89]
А поюзать CustomAttribute членов, например ....


 
euru ©   (2007-10-10 16:18) [91]


> oxffff ©   (10.10.07 10:53) [84]
> Привидите конкретный пример.

У меня нет конкретного примера. Собственно, как и утверждения, что


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


Я просто хочу знать, чем такой способ 1) проще и 2) разумнее не с точки зрения разработки языка программирования, а с точки зрения его применения.


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


> А как вы собираетесь работать с метаданными класса в .NET
> используя static метод класса


Точно также, как Delphi, в С++ плюс isasa ©   (10.10.07 15:55) [90]
Если есть метод, который не зависит от конкретного экземпляра, то я не вижу причины не сделать его class function или class procedure. При этом вызывающая сторона не подозревает о том, какой это метод, работая с  экземпляром.


 
euru ©   (2007-10-10 16:32) [93]


> Игорь Шевченко ©   (10.10.07 16:24) [92]
В С# нельзя обратиться к статическому методу класса через экземпляр этого класса.


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

euru ©   (10.10.07 16:32) [93

Через тип можно обратиться, особой разницы не вижу.


 
oxffff ©   (2007-10-10 16:43) [95]

Игорь Шевченко ©   (10.10.07 16:24) [92]
isasa ©   (10.10.07 15:55) [90]
Игорь Шевченко ©   (10.10.07 16:39) [94]

MSDN
A static method, field, property, or event is callable on a class even when no instance of the class has been created. If any instances of the class are created, they cannot be used to access the static member. Only one copy of static fields and events exists, and static methods and properties can only access static fields and static events


 
oxffff ©   (2007-10-10 16:44) [96]


> Игорь Шевченко ©   (10.10.07 16:39) [94]
> euru ©   (10.10.07 16:32) [93
>
> Через тип можно обратиться, особой разницы не вижу.


Да в том, что принципиально разница есть. см [86]


 
euru ©   (2007-10-10 16:45) [97]


> Игорь Шевченко ©   (10.10.07 16:39) [94]
Ну, тогда вызывающая сторона должна явно знать, что вызываемый метод статический и что этот метод привязан к конкретному классу.


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

oxffff ©   (10.10.07 16:43) [95]


> static methods and properties can only access static fields
> and static events


У бабочек (в смысле, в Delphi) то же самое. А в версиях до 2005 и статических свойств и полей не было.

Я, если честно, не понимаю, что ты мне хочешь доказать.


 
Суслик ©   (2007-10-10 16:52) [99]

я вот тоже не понимаю о чем спор.

будучи заинтересованным читателей попрошу oxffff описать предмет спора (я тоже хочу поучаствовать :) ).


 
clickmaker ©   (2007-10-10 16:54) [100]


> я вот тоже не понимаю о чем спор.

"я дерусь... потому что я дерусь!"
(c) Портос
:)


 
oxffff ©   (2007-10-10 16:55) [101]


> Игорь Шевченко ©   (10.10.07 16:47) [98]
> oxffff ©   (10.10.07 16:43) [95]
>
>
> > static methods and properties can only access static fields
>
> > and static events
>
>
> У бабочек (в смысле, в Delphi) то же самое. А в версиях
> до 2005 и статических свойств и полей не было.
>
> Я, если честно, не понимаю, что ты мне хочешь доказать.


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

Я лишь стараюсь указать на различие между классовыми методами Delphi и static методами С++ и .NET
И на их идентичность (С++ и .NET) со статическими классовыми методами Delphi.


 
oxffff ©   (2007-10-10 16:56) [102]


> clickmaker ©   (10.10.07 16:54) [100]
>
> > я вот тоже не понимаю о чем спор.
>
> "я дерусь... потому что я дерусь!"
> (c) Портос
> :)


Неа. Я сейчас перерабатываю свой трехмерный движок.


 
Суслик ©   (2007-10-10 16:58) [103]


> Я лишь стараюсь указать на различие между классовыми методами
> Delphi и static методами С++ и .NET
> И на их идентичность (С++ и .NET) со статическими классовыми
> методами Delphi.

я думаю, что это всем и так известно. нет?


 
euru ©   (2007-10-10 17:01) [104]


> Игорь Шевченко ©   (10.10.07 16:47) [98]

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


 
oxffff ©   (2007-10-10 17:03) [105]


> euru ©   (10.10.07 17:01) [104]
>
> > Игорь Шевченко ©   (10.10.07 16:47) [98]
>
> Но в Delphi, насколько я помню, можно вызывать методы класса
> через экземпляры класса.


А вы сейчас что предпочитаете из языков?
А то у нас с вами часто диалоги случаются. :)


 
euru ©   (2007-10-10 17:03) [106]


> oxffff ©   (10.10.07 16:56) [102]

А что по поводу euru ©  (10.10.07 16:18) [91]?


 
oxffff ©   (2007-10-10 17:06) [107]


> euru ©   (10.10.07 16:18) [91]
>
> > oxffff ©   (10.10.07 10:53) [84]
> > Привидите конкретный пример.
>
> У меня нет конкретного примера. Собственно, как и утверждения,
>  что
>
>
> > Зачем вводить понятия, если проще делегировать другому
> типу.
> > Это действительно разумнее с точки зрения ООП.
>
>
> Я просто хочу знать, чем такой способ 1) проще и 2) разумнее
> не с точки зрения разработки языка программирования, а с
> точки зрения его применения.


Думаю с точки зрения применения никакой разницы нет.


 
oxffff ©   (2007-10-10 17:10) [108]


> Думаю с точки зрения применения никакой разницы нет.


Хотя есть одно. в .NET языках (хотя бы С#) нет прямого способа определить виртульный метод для наследника System.Type. Хотя технически ничего не мешает. Видимо посчитали, что это не нужно.


 
euru ©   (2007-10-10 17:10) [109]


> oxffff ©   (10.10.07 17:03) [105]
Из языков я предпочитаю ABAP :)

Просто по привычке и из интереса слежу за развитием языков программирования. Так как я сейчас ни к одному из популярных ЯП не привязан, могу без субъективных пристрастий к тому или иному языку оценивать их преимущества и недостатки. Оценки, естественно, субъективные.


 
oxffff ©   (2007-10-10 17:16) [110]


> euru ©   (10.10.07 17:10) [109]
>
> > oxffff ©   (10.10.07 17:03) [105]
> Из языков я предпочитаю ABAP :)


Да вы что. :)
И я тоже на нем программирую.


 
euru ©   (2007-10-10 17:19) [111]


> oxffff ©   (10.10.07 17:06) [107]
> Думаю с точки зрения применения никакой разницы нет.

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


 
vpbar ©   (2007-10-10 17:23) [112]

>>euru ©   (10.10.07 17:19) [111]
Даа. Заработался. Три раза перечитывал пока понял что написано :)
Не равносильно. Но с точки зрения применения никакой разницы нет


 
oxffff ©   (2007-10-10 17:35) [113]


> euru ©   (10.10.07 17:19) [111]
>
> > oxffff ©   (10.10.07 17:06) [107]
> > Думаю с точки зрения применения никакой разницы нет.
>
> Т.е. знание о возможности получения информации о классе
> от самого класса равносильно знанию о том, что для получения
> информации о классе необходимо знать о существовании другого
> класса, предоставляющего эту информацию, а также о наличии
> специального оператора для получения этого другого класса.
>


Дело вкуса. Ведь по большому счету и там и там делегирование.

Delphi

mov ecx,[eax], где eax - Object type

C#
objectRef.getType() если .NET Runtime сделает inline, то вообще замечательно.


 
euru ©   (2007-10-10 17:42) [114]


> vpbar ©   (10.10.07 17:23) [112]
> Не равносильно. Но с точки зрения применения никакой разницы
> нет

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


 
oxffff ©   (2007-10-10 17:43) [115]


> Object type


TObject type

>C#
>objectRef.getType() если .NET Runtime сделает inline, то вообще >замечательно.

Inline не пахнет. Так что с точки зрения скорости медленнее.


 
Игорь Шевченко ©   (2007-10-10 17:46) [116]

oxffff ©   (10.10.07 16:55) [101]


> Я лишь стараюсь указать на различие между классовыми методами
> Delphi и static методами С++ и .NET
> И на их идентичность (С++ и .NET) со статическими классовыми
> методами Delphi.


Замечательно. С тем, что есть различия реализации, я целиком и полностью согласен.

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


 
oxffff ©   (2007-10-10 17:52) [117]


>  то в чем разница-то ? :)


См. euru [97].

Ну или еще проще, то также как между указателями на метод С++ и указатель на метод в Delphi.

С++ мы должны явно указать тип.
+ никакого позднего связывания.


 
Игорь Шевченко ©   (2007-10-10 18:02) [118]

oxffff ©   (10.10.07 17:52) [117]


> См. euru [97].


См. Игорь Шевченко ©   (10.10.07 17:46) [116]

Не надо отталкиваться от различий в реализации.


 
euru ©   (2007-10-10 18:10) [119]


> Игорь Шевченко ©   (10.10.07 18:02) [118]
Различия реализации могут в общем случае привести в различиях назначения.


 
oxffff ©   (2007-10-10 19:14) [120]


>
> Игорь Шевченко ©   (10.10.07 18:02) [118]
> oxffff ©   (10.10.07 17:52) [117]
>
>
> > См. euru [97].
>
>
> См. Игорь Шевченко ©   (10.10.07 17:46) [116]
>
> Не надо отталкиваться от различий в реализации.


Назначение разное.

procedure abc(a:Tclass);
begin
showmessage(inttostr(a.InstanceSize));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
abc(TButton);
abc(Tobject);
end;

В случае class static метода. Вы делать так.

class procedure Myclass1.abc;static
begin
showmessage(inttostr(Myclass1.InstanceSize));
end;

class procedure Myclass2.abc;static
begin
showmessage(inttostr(Myclass2.InstanceSize));
end;

class procedure Myclass3.abc;static
begin
showmessage(inttostr(Myclass3.InstanceSize));
end;



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

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

Наверх





Память: 0.7 MB
Время: 0.054 c
2-1193313998
DimOk
2007-10-25 16:06
2007.11.18
Удаление файла


2-1193111836
031178
2007-10-23 07:57
2007.11.18
Поиск в TreeView


2-1193675500
Neo
2007-10-29 19:31
2007.11.18
что не так ?


6-1174065437
Сет-тер
2007-03-16 20:17
2007.11.18
Расширение прав


15-1192430055
Layner
2007-10-15 10:34
2007.11.18
Можно ли в Delphi 2007 писать приложения для PDA WM5?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский