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

Вниз

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

 
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;


 
oxffff ©   (2007-10-10 19:21) [121]

Я думаю не совсем корректно они дали название как class var, так сlass static proc. Дали бы просто Static название и путаницы было бы меньше.
Так как отношения к классу как таковому не имеют, а только имеет отношение к класс Scope.

class var - некорректное название поскольку подразумевает, что данный метакласс обладает переменной, но не разделяет ее с дочерними классами.
А class var разделяет дочерними классами.

Более корректное определение просто static var, static proc.

Ну не смертельно будем знать, что это значит.


 
oxffff ©   (2007-10-11 09:39) [122]

up


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

euru ©   (10.10.07 18:10) [119]


> Различия реализации могут в общем случае привести в различиях
> назначения.


Не надо про общие случаи. Давай про конкретный случай - классовые методы.

oxffff ©   (10.10.07 19:14) [120]


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


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

Это общая беда или я чего-то не понимаю ? От того, что в ассемблере VAX операция присваивания записывается mov source,destination, а в ассемблере x86 mov destination,source у команды mov тоже разное назначение ?

Абстрагируйтесь, плиз, от реализации


 
oxffff ©   (2007-10-11 10:10) [124]

Классовый метод Delphi - это классовый метод Delphi.
Его назначение работа с метаклассом.
Классовый метод работает только с метаклассом
В котором есть поля (Эти поля по отрицательному смещению от VMT).
Нормальными средствами дополнить эти поля мы не можем.

Статичный метод в С++,.NET является статичным, но не классовым.
Связан он с классом и дочерними классами только областью видимости.
Так же как и static поля, которые связаны с классом только областью видимости. Как вы указали выше, это обычные процедуры и глобальные переменные с ограниченной областью видимости.
Поэтому все статичные методы и статичные поля имеют отношение к  дереву или лесу классов. Но они не связаны с каким то определенным классом.

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

Аналогом в Delphi статичным методов и статичных полей является class var и class static proc.
Хотя как я указал выше - это название может сбить с толку.


 
euru ©   (2007-10-11 11:10) [125]


> Игорь Шевченко ©   (11.10.07 09:51) [123]
> Не надо про общие случаи. Давай про конкретный случай -
> классовые методы
На уровне гипотезы. Но пока опровержения не встречались.

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

Если эта гипотеза верна, то введение в Delphi понятие статического метода - лишнее усложнение языка.


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


> В котором есть поля (Эти поля по отрицательному смещению
> от VMT).
> Нормальными средствами дополнить эти поля мы не можем.


Ты что, скрипач, дальтоник ? Зеленый от оранжевого отличить не можешь ?
Какая мне разница, что такое VMT и отрицательные смещения ?

Классовый метод - это метод, не зависящий от конкретного экземпляра.
И не более того. Может обращаться данным, не зависящим от экземпляра, например, к метаданным (if any), может вызывать другие классовые методы, может возвращать константы.


 
oxffff ©   (2007-10-11 12:21) [127]

Если рассмотреть метакласс как обычный объект, то статический метод будет процедурой или функций объявленной в class namespace, так же как и class var. :)

Но вот 5 квалификаторов видимости запутывают эту картину еще сильней.


 
oxffff ©   (2007-10-11 12:27) [128]


> Игорь Шевченко ©   (11.10.07 12:13) [126]
>
> > В котором есть поля (Эти поля по отрицательному смещению
>
> > от VMT).
> > Нормальными средствами дополнить эти поля мы не можем.
>
>
>
> Ты что, скрипач, дальтоник ? Зеленый от оранжевого отличить
> не можешь ?
> Какая мне разница, что такое VMT и отрицательные смещения
> ?
>
> Классовый метод - это метод, не зависящий от конкретного
> экземпляра.
> И не более того. Может обращаться данным, не зависящим от
> экземпляра, например, к метаданным (if any), может вызывать
> другие классовые методы, может возвращать константы.


Вы явно не хотите даже прочитать. Вам 156 раз сказали.
Что не может статический метод обратиться к метаданным, не указав явно тип. А если делать так,то вообще смысл этих статических методов в чем?
Если тоже самое можно сделать с помощью обычных процедур.

При всем уважение к вам.
Извольте почитать мат часть.


 
vpbar ©   (2007-10-11 12:30) [129]

Нда, видимо верно :)
"Для программистов на C++ или Delphi термин метакласс вызывает некоторые сложности в понимании. В C++ и Delphi самым базовым объектом является класс. Методы и данные класса являются постоянными (static) членами класса. В случае SOM ситуация иная. В упрощенном понимании, классы являются экземплярами метаклассов, а объекты являются экземплярами классов. Метакласс содержит все функции и данные, относящиеся к классу. Говоря иначе, метакласс может содержат данные и методы, которые в C++ и Delphi явно или косвенно объявлены статическими, к которым относятся, например, конструкторы." (с)http://ru.ecomstation.ru/showarticle.php?id=144


 
Ins ©   (2007-10-11 12:31) [130]


> А если делать так,то вообще смысл этих статических методов
> в чем?

В области видимости смысл и только. Тоже считаю, что у дельфийских классовых методов смысл несколько иной.


 
oxffff ©   (2007-10-11 12:35) [131]


> Ins ©   (11.10.07 12:31) [130]
>
> > А если делать так,то вообще смысл этих статических методов
>
> > в чем?
>
> В области видимости смысл и только. Тоже считаю, что у дельфийских
> классовых методов смысл несколько иной.


oxffff ©   (11.10.07 12:21) [127].
А как быть с private, protected, public Да еще и +strict?


 
reonid ©   (2007-10-11 12:35) [132]

>Ins ©   (11.10.07 12:31) [130]

Всё дело в виртуальности. И только.
Классовый метод в дельфях может быть виртуален,
а статический метод класса в С++, из которого растут
ноги у статических классовых методов дотнета - не может.

Естественно, что у виртуальных функций смысл несколько иной,
чем у невиртуальных.


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


> Что не может статический метод обратиться к метаданным,
> не указав явно тип


Ты тоже читать не умеешь. Еще раз - классовый метод может работать с данными, не зависящими от конкретного экземпляра.


 
oxffff ©   (2007-10-11 12:40) [134]


> vpbar ©   (11.10.07 12:30) [129]
> Нда, видимо верно :)
> "Для программистов на C++ или Delphi термин метакласс вызывает
> некоторые сложности в понимании. В C++ и Delphi самым базовым
> объектом является класс. Методы и данные класса являются
> постоянными (static) членами класса. В случае SOM ситуация
> иная. В упрощенном понимании, классы являются экземплярами
> метаклассов, а объекты являются экземплярами классов. Метакласс
> содержит все функции и данные, относящиеся к классу. Говоря
> иначе, метакласс может содержат данные и методы, которые
> в C++ и Delphi явно или косвенно объявлены статическими,
>  к которым относятся, например, конструкторы." (с)http://ru.
> ecomstation.ru/showarticle.php?id=144


Только вот в С++ нет понятия метакласс.
Есть понятие родовой класс, хотя Гради Буч и использует понятие метакласс.
Но это не метакласс в понимании Delphi.


 
vpbar ©   (2007-10-11 12:41) [135]

>>oxffff ©   (11.10.07 12:40) [134]
>>Только вот в С++ нет понятия метакласс.
Да?
>>Но это не метакласс в понимании Delphi.
Это точнее. В Delphi тоже нет метаклассов..... в понимани Smalltalk-а


 
Ins ©   (2007-10-11 12:42) [136]


> oxffff ©   (11.10.07 12:35) [131]

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


 
Ins ©   (2007-10-11 12:47) [137]


> Еще раз - классовый метод может работать с данными, не зависящими
> от конкретного экземпляра.

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


> Классовый метод в дельфях может быть виртуален

Естественно и именно потому, что он знает о классе, которому принадлежит. И в этом его отличие от статического метода.


 
oxffff ©   (2007-10-11 12:48) [138]


> reonid ©   (11.10.07 12:35) [132]
> >Ins ©   (11.10.07 12:31) [130]
>
> Всё дело в виртуальности. И только.
> Классовый метод в дельфях может быть виртуален,
> а статический метод класса в С++, из которого растут
> ноги у статических классовых методов дотнета - не может.
>  
>
> Естественно, что у виртуальных функций смысл несколько иной,
>  
> чем у невиртуальных.


Классовый метод работает с абстракцией метакласса.
Хейлсберг и его три другие кореша  реализовал в .NET тоже самое только выделив это в отдельный объект экземпляр System.Type.
Поэтому методы System.Type являются аналогами классовых методов
Delphi. Принципиально ничего не мешает им ввести в .NET способ
определить дополнительные методы для описателя типа - экземпляра System.Type. Но это не введено в язык. И видимо и не нужно.
Также как и их виртуальность.
Ведь виртуальный классовый метод, нужен был только для целей NewInstance, для полиморфного определения поведения метода разщения экземпляра типа. Фактически это возможность в большинстве случаев не используют. Но можно значительно ускорить создание объектов не постоянно обращаесть менеджеру кучи, А например к пулу объектов.
А поскольку способ размещения объектов .NET в управляемой куче, то виртульность классового метода не нужна


 
Ins ©   (2007-10-11 12:48) [139]


> reonid ©   (11.10.07 12:35) [132]

Да к тому же я в [38] это говорил. ;-)


 
Ins ©   (2007-10-11 12:51) [140]


> Ведь виртуальный классовый метод, нужен был только для целей
> NewInstance

А откуда такие сведения? Лично я возможность делать классовые методы виртуальными использую, значит это сделали и для меня в т.ч. :)


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


> Ведь виртуальный классовый метод, нужен был только для целей
> NewInstance, для полиморфного определения поведения метода
> разщения экземпляра типа


Ерунда, уж извини. Я, например, довольно активно использую виртуальные классовые методы на Delphi, когда мне надо обратиться к свойствам конкретного класса (не объекта), заранее неизвестного, но являющегося наследником известного предка.


 
oxffff ©   (2007-10-11 12:52) [142]


> vpbar ©   (11.10.07 12:41) [135]
> >>oxffff ©   (11.10.07 12:40) [134]
> >>Только вот в С++ нет понятия метакласс.
> Да?
> >>Но это не метакласс в понимании Delphi.
> Это точнее. В Delphi тоже нет метаклассов..... в понимани
> Smalltalk-а


Еще раз.
Русский перевод одинаков. А смысл разный.
Он (Буч) его называет параметризованный класс, метакласс, родовой класс.
Но это не метакласс в понимании Delphi.


 
Суслик ©   (2007-10-11 12:56) [143]

у меня вообще весь мой object-persistant-framework устроен на виртуальных классовых методах.


 
euru ©   (2007-10-11 12:56) [144]


> Игорь Шевченко ©   (11.10.07 12:38) [133]
> Еще раз - классовый метод может работать с данными, не зависящими от конкретного экземпляра.

Классовый метод зависит от класса, от имени которого его вызывают.
Статический метод не зависит от класса, он привязан к вполне определённому классу.


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

euru ©   (11.10.07 12:56) [144]

Как реализовать. Назначение при этом не меняется.


 
vpbar ©   (2007-10-11 12:59) [146]

>>oxffff ©   (11.10.07 12:52) [142]
Дык. Еще раз я не спорю что эта штука в С++ не метакласс в понимании Delphi.
Я не совсем понимаю что такое метакласс вообще. А в делфи вообще где сказано про метаклассы?


 
Ins ©   (2007-10-11 12:59) [147]

Спор вообще о чем? О том, что классовый метод в понимании Delphi и static-метод в понимании .NET - это не одно и то же? Я считаю, что не одно и то же. Кто еще так считает?


 
oxffff ©   (2007-10-11 13:02) [148]


> Игорь Шевченко ©   (11.10.07 12:52) [141]
>
> > Ведь виртуальный классовый метод, нужен был только для
> целей
> > NewInstance, для полиморфного определения поведения метода
>
> > разщения экземпляра типа
>
>
> Ерунда, уж извини. Я, например, довольно активно использую
> виртуальные классовые методы на Delphi, когда мне надо обратиться
> к свойствам конкретного класса (не объекта), заранее неизвестного,
>  но являющегося наследником известного предка.


нет, не ерунда.
Активно он используется именно для этих целей (для NewInstance).
И придумали его для этих целей. аля перегрузка оператора new(C++)

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


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


> Кто еще так считает?

Я

Ибо в дельфи теперь есть оба варианта, и static и не-static.


 
oxffff ©   (2007-10-11 13:04) [150]


> Суслик ©   (11.10.07 12:56) [143]
> у меня вообще весь мой object-persistant-framework устроен
> на виртуальных классовых методах.


Я тоже использую его. Но только по причине см [147]


 
Ins ©   (2007-10-11 13:05) [151]


> Ибо в дельфи теперь есть оба варианта, и static и не-static.

Тоже логично, но у меня аргументация такая: классовый метод, как следует из его названия, знает к какому классу он относится и позволяет оперировать данными самого класса, к которому он относится, а не его экземпляра. Это и есть его прямое предназначение. Статический метод .NET этого не позволяет, без явного указания на класс. Поэтому назвать его классовым методом с этой точки зрения нельзя.


 
oxffff ©   (2007-10-11 13:06) [152]


> Я тоже использую его. Но только по причине см [147]


Я тоже использую его. Но только по причине см [148]


 
oxffff ©   (2007-10-11 13:06) [153]


> Я тоже использую его. Но только по причине см [147]


Я тоже использую его. Но только по причине см [148]


 
reonid ©   (2007-10-11 13:10) [154]

> Поэтому методы System.Type являются аналогами классовых методов

Я с дотнетом не работаю, так что могу ошибаться.
Насколько я понимаю, методы System.Type - это всего лишь методы
объекта, имеющего тип System.Type. И они могут быть
даже невиртуальными, ведь наследников у System.Type нет.
Или я ошибаюсь?

В дельфях, например, обратиться к пользовательским
виртуальным классовым методам можно только через
переменную, имеющую тип
TXXXClass = class of TXXX. Есть ли аналог чего-нибудь
подобного в дотнет?


 
oxffff ©   (2007-10-11 13:11) [155]


> oxffff ©   (11.10.07 13:02) [148]
>
> > Игорь Шевченко ©   (11.10.07 12:52) [141]
> >
> > > Ведь виртуальный классовый метод, нужен был только для
>
> > целей
> > > NewInstance, для полиморфного определения поведения
> метода
> >
> > > разщения экземпляра типа
> >
> >
> > Ерунда, уж извини. Я, например, довольно активно использую
>
> > виртуальные классовые методы на Delphi, когда мне надо
> обратиться
> > к свойствам конкретного класса (не объекта), заранее неизвестного,
>
> >  но являющегося наследником известного предка.
>
>
> нет, не ерунда.
> Активно он используется именно для этих целей (для NewInstance).
>
> И придумали его для этих целей. аля перегрузка оператора
> new(C++)
>
> А то, что не было средств для расширения полей метакласса,
>  поэтому вам и приходиться полагаться на виртуальный классовый
> метод.
> А если бы были, то вам хватило бы и невиртуального метода.
>


Их прочем и сейчас нет.
class var - restricted global var class scope

Кстати мы действительно отошли от темы.

см. Ins ©   (11.10.07 12:59) [147]


 
Ins ©   (2007-10-11 13:19) [156]


> Суслик ©   (11.10.07 13:03) [149]

Считаете ли вы, что тут дело не только в аспектах реализации, но есть и идеологические различия?


 
oxffff ©   (2007-10-11 13:19) [157]


> reonid ©   (11.10.07 13:10) [154]
> > Поэтому методы System.Type являются аналогами классовых
> методов
>
> Я с дотнетом не работаю, так что могу ошибаться.
> Насколько я понимаю, методы System.Type - это всего лишь
> методы
> объекта, имеющего тип System.Type. И они могут быть
> даже невиртуальными, ведь наследников у System.Type нет.
>  
> Или я ошибаюсь?
>
> В дельфях, например, обратиться к пользовательским
> виртуальным классовым методам можно только через
> переменную, имеющую тип
> TXXXClass = class of TXXX. Есть ли аналог чего-нибудь
> подобного в дотнет?


Я тоже вообще практически с ним не работаю, только ecma читаю

System.Type

Represents type declarations: class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types.

Фактически это средство доступа к метаданным.
Это обобщенное средство того, что дает в Delphi Typeinfo и метакласс

Судя по всему на каждый тип в создаетеся по одному экземпляру System.Type.

>В дельфях, например, обратиться к пользовательским
>виртуальным классовым методам можно только через
>переменную, имеющую тип
>TXXXClass = class of TXXX. Есть ли аналог чего-нибудь
>подобного в дотнет?

Языковых средств не предусмотрено для введения виртуальных функций System.Type.


 
etc   (2007-10-11 13:20) [158]


> ведь наследников у System.Type нет.
> Или я ошибаюсь?

ошибаетесь, он абстракный, да и наследовать от него незапрещено


 
reonid ©   (2007-10-11 13:33) [159]

> etc   (11.10.07 13:20) [158]
Спасибо. Буду знать.
Интересно, имеет смысл наследник этого типа, написанный пользователем?
Иначе сей факт это всего лишь деталь реализации...

> oxffff ©   (11.10.07 13:19) [157]

Тогда эта фраза
>> Поэтому методы System.Type являются аналогами классовых методов
имеет смысл: это разные вещи, но и те, и другие применяются
для доступа к метаданным. Больше между ними ничего общего нет.

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


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


>  [156] Ins ©   (11.10.07 13:19)
> > Суслик ©   (11.10.07 13:03) [149]
> Считаете ли вы, что тут дело не только в аспектах реализации,
> но есть и идеологические различия?


Если честно, то я считаю, что текущее состояние языка object-delphi является вынужденным. Безусловно некая идеология есть здесь. Но Дельфи всегда придерживался принципа

что-то follows implemntation.

Например, documentation follows implementation, theory follows implementation and so on.

Посему не уверен, что идеология шла впереди реализации.

ЗЫ Не сам придумал, читал о такой позиции в группах еще тогда борландовых.



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

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

Наверх




Память: 0.86 MB
Время: 0.046 c
6-1174302469
S_T_E_P_A_N___
2007-03-19 14:07
2007.11.18
Использование SOCS-прокси


5-1163327689
Poisent
2006-11-12 13:34
2007.11.18
Помогите с редактором свойств.


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


2-1193223678
Ega23
2007-10-24 15:01
2007.11.18
Parent и Owner


15-1192133280
Eraser
2007-10-12 00:08
2007.11.18
Трансляции формулы 1