Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1193163627
opoloXAI
2007-10-23 22:20
2007.11.18
Как вставить в TEdit знак "Ø"?


2-1193065535
@!!ex
2007-10-22 19:05
2007.11.18
Float To Str & Decimal Separator


2-1193519796
Delpr
2007-10-28 01:16
2007.11.18
Вызов функции из запроса


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


15-1192359213
Kostafey
2007-10-14 14:53
2007.11.18
С днем рождения ! 14 октября





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