Форум: "Прочее";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];
ВнизВ чём прикол 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;
Скачать: [xml.tar.bz2];
Память: 0.84 MB
Время: 0.055 c