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

Вниз

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

 
Суслик ©   (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.

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

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


 
isasa ©   (2007-10-11 13:39) [161]

:)
спор переходит в плоскость:
"А нужно ли ставить автомобиль на яму, если в нем имеется капот?"


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


> etc   (11.10.07 13:20) [158]
>
> > ведь наследников у System.Type нет.
> > Или я ошибаюсь?
>
> ошибаетесь, он абстракный, да и наследовать от него незапрещено


Странно пример это не подтверждает.

    public Form1()
       {
           String A="abc";
           String C = "asdasd";
           Int32 B=0;

           if (A.GetType() == C.GetType())
           {
               B = B + 1;
           }
           if (A.GetType() == B.GetType())
             {
              B = B + 2;
             }
           if (A.GetType().GetType()==B.GetType().GetType())
           {
           B=B+4;
           }
           InitializeComponent();
       }

первых if - TRUE (типы совпадают)
второй if - FALSE (типы не совпадают)
третий if - TRUE  (тип для типов совпадают)

Согласно третьему вы не правы.
Тип описатель для типов описателей  для типов String и Int32 идентичен

Да и где написано, что он абстрактный?


 
isasa ©   (2007-10-11 13:54) [163]

:) Дельфи нет под рукой, но думаю там аналогично ...

C#
[SerializableAttribute]
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public abstract class Type : MemberInfo, _Type, IReflect


Type is the root of the System.Reflection functionality and is the primary way to access metadata. Use the members of Type to get information about a type declaration, such as the constructors, methods, fields, properties, and events of a class, as well as the module and the assembly in which the class is deployed.

The C# typeof operator (GetType operator in Visual Basic, typeid operator in Visual C++) returns a Type object.


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


> reonid ©   (11.10.07 13:33) [159]
> > etc   (11.10.07 13:20) [158]
> Спасибо. Буду знать.
> Интересно, имеет смысл наследник этого типа, написанный
> пользователем?
> Иначе сей факт это всего лишь деталь реализации...
>
> > oxffff ©   (11.10.07 13:19) [157]
>
> Тогда эта фраза
> >> Поэтому методы System.Type являются аналогами классовых
> методов
> имеет смысл: это разные вещи, но и те, и другие применяются
>
> для доступа к метаданным. Больше между ними ничего общего
> нет.
>
> Но область применения дельфийских классовых методов,
> вообще говоря, метаданными не ограничивается.
> А как же пользовательские виртуальные классовые методы?


Так классовые методы нужны для доступа к метаданным класса.
Для typinfo тоже есть процедуры, но они в typinfo.
Они также принимают параметр typeinfo.
Они являются также типовыми процедурами (классовые методы в виде процедуры).
Абстрагируйтесь.
Просто в .NET Хейлберг слил все один тип.

Оно и понятно, кто сейчас захочет переписать System.pas?.
Хотя потенциально работы  не много.
Но только прощай совместимость. :)


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


> isasa ©   (11.10.07 13:54) [163]


Тогда как объяснить oxffff ©   (11.10.07 13:48) [162]
третий if сверху.


 
oxffff ©   (2007-10-11 14:08) [166]


> oxffff ©   (11.10.07 13:58) [165]
>
> > isasa ©   (11.10.07 13:54) [163]
>
>
> Тогда как объяснить oxffff ©   (11.10.07 13:48) [162]
> третий if сверху.


То есть второй показывает, что типы  String и Int32 не идентичны.
А третий показывает, идентичность типов для типов string и Int32.
Хотя да наследовали один тип от system.Type и все в нем реализовали и он называется  RuntimeType.

       static void Main(string[] args)
       {
           String A="abc";
           String C = "asdasd";
           Int32 B=0;

           Console.WriteLine(A.GetType().ToString());
           Console.WriteLine(B.GetType().ToString());
           Console.WriteLine(C.GetType().ToString());
           Console.WriteLine(A.GetType().GetType().ToString());
           Console.WriteLine(B.GetType().GetType().ToString());
           
           if (A.GetType() == C.GetType())
           {
               Console.WriteLine(A.GetType().ToString());
               Console.WriteLine(C.GetType().ToString());
           }
           if (A.GetType() == B.GetType())
             {
              B = B + 2;
             }
           if (A.GetType().GetType()==B.GetType().GetType())
           {
           B=B+4;
           }

       }


 
euru ©   (2007-10-11 14:09) [167]


> oxffff ©   (11.10.07 13:58) [165]

Не доцитировано.

Type is an abstract base class that allows multiple implementations. The system will always provide the derived class RuntimeType.


 
oxffff ©   (2007-10-11 14:10) [168]


> euru ©   (11.10.07 14:09) [167]
>
> > oxffff ©   (11.10.07 13:58) [165]
>
> Не доцитировано.
>
> Type is an abstract base class that allows multiple implementations.
>  The system will always provide the derived class RuntimeType.
>


Проверено. Подтверждаю
oxffff ©   (11.10.07 14:08) [166]


 
isasa ©   (2007-10-11 14:11) [169]

oxffff ©   (11.10.07 13:58) [165]
:)
Только тем, что
(тип для типов совпадают)
совпадают. Следовало ожидать, т.к. и тот и другой Referense Based (MarshalByRefObject)


 
oxffff ©   (2007-10-11 14:24) [170]


> isasa ©   (11.10.07 14:11) [169]
> oxffff ©   (11.10.07 13:58) [165]
> :)
> Только тем, что
> (тип для типов совпадают)
> совпадают. Следовало ожидать, т.к. и тот и другой Referense
> Based (MarshalByRefObject)


Int32 у меня не box-овый.
А тип MarshalByRefObject вообще не к месту.

Что то я не понял вас?


 
oxffff ©   (2007-10-11 14:32) [171]

Кажется понял.
Для remote objects для доступа к metadata могут сделать другой, делегирующий потомок от System.Type?


 
reonid ©   (2007-10-11 14:55) [172]

2oxffff ©   (11.10.07 13:56) [164]
> Так классовые методы нужны для доступа к метаданным класса.

Ну вот, приехали...
Вообще-то, в дельфях классовые методы с успехом
использовались и для других целей.


 
vpbar ©   (2007-10-11 15:12) [173]

>>reonid ©   (11.10.07 14:55) [172]
А кстати  для чего?
Я в основном использую для того чтобы создать экземпляры класса выбираемого в во время выполнения.
И в исходниках из ...Delphi\Source\* применяют в основном для тогоже


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


> reonid ©   (11.10.07 14:55) [172]
> 2oxffff ©   (11.10.07 13:56) [164]
> > Так классовые методы нужны для доступа к метаданным класса.
>
>
> Ну вот, приехали...
> Вообще-то, в дельфях классовые методы с успехом
> использовались и для других целей.


Угу. Не связанных с самим типом.
Может посмотреть все классовые методы Tobject и сделать выводы.
Если вы их использовали не по назначениею, то это тоже самое, что использовать методы (в том числе и виртуальные) объекта для доступа к глобальным переменным.
Все же их назначение работа с метаклассом.


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


> vpbar ©   (11.10.07 15:12) [173]
> >>reonid ©   (11.10.07 14:55) [172]
> А кстати  для чего?
> Я в основном использую для того чтобы создать экземпляры
> класса выбираемого в во время выполнения.
> И в исходниках из ...Delphi\Source\* применяют в основном
> для тогоже


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


 
vpbar ©   (2007-10-11 15:36) [176]

>>oxffff ©   (11.10.07 15:16) [174]
Извините что в мешиваюсь, если у вас диалог. Но посмотрел на это -  все , кроме class function NewInstance: TObject; virtual; который иногда нужно переопределять, - костыли. Все это  можно было бы добавить в язык и реализовать в компиляторе. Все равно определить свой TObject неполучится, т.к. модифицировать всякие vmt вроде нельзя. Буду рад если ошибаюсь.


 
vpbar ©   (2007-10-11 15:38) [177]

>>oxffff ©   (11.10.07 15:33) [175]
Можно ,конечно, просто я не встречал где это нужно, кроме полиморфного конструктора.


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


> vpbar ©   (11.10.07 15:36) [176]
> >>oxffff ©   (11.10.07 15:16) [174]
> Извините что в мешиваюсь, если у вас диалог. Но посмотрел
> на это -  все , кроме class function NewInstance: TObject;
>  virtual; который иногда нужно переопределять, - костыли.
>  Все это  можно было бы добавить в язык и реализовать в
> компиляторе. Все равно определить свой TObject неполучится,
>  т.к. модифицировать всякие vmt вроде нельзя. Буду рад если
> ошибаюсь.


Можно подробней. Я что то не понял. Где костыли?


 
vpbar ©   (2007-10-11 15:55) [179]

>>oxffff ©   (11.10.07 15:38) [178]
В том смысле что можно было, например,  добавить ключевое слово parent (или сделать его втроенным методом классов) и реализацию
class function TObject.ClassParent: TClass;
{$IFDEF PUREPASCAL}
begin
 Pointer(Result) := PPointer(Integer(Self) + vmtParent)^;
 if Result <> nil then
   Pointer(Result) := PPointer(Result)^;
end;

Не описывать, а запрятать внутрь компилятора. Все равно тут идет обращение к структурам (PPointer(Integer(Self) + vmtParent)^) которые (если не ошибаюсь) доступны для изменения только компилятору


 
vpbar ©   (2007-10-11 16:03) [180]

>>vpbar ©   (11.10.07 15:55) [179]
А костылями назвал, потомучто классовые методы TObject вроде ClassParent реализуют ОО модель языка, бессмысленны для переопределения и могли бы (и ИМХО так былобы логичнее) быть вынесены в грамматику.


 
oxffff ©   (2007-10-11 16:05) [181]


> vpbar ©   (11.10.07 15:55) [179]
> >>oxffff ©   (11.10.07 15:38) [178]
> В том смысле что можно было, например,  добавить ключевое
> слово parent (или сделать его втроенным методом классов)
> и реализацию
> class function TObject.ClassParent: TClass;
> {$IFDEF PUREPASCAL}
> begin
>  Pointer(Result) := PPointer(Integer(Self) + vmtParent)^;
>
>  if Result <> nil then
>    Pointer(Result) := PPointer(Result)^;
> end;
>
> Не описывать, а запрятать внутрь компилятора. Все равно
> тут идет обращение к структурам (PPointer(Integer(Self)
> + vmtParent)^) которые (если не ошибаюсь) доступны для изменения
> только компилятору


Так если  classparent поменять на parent ничего же не измениться.
Здесь вся идеалогия, в том что создание экзепляра типа или операции над типом (например финализация, получение интерфейса и т.д.) делегирована ответственному за это объекту (метаклассу).

>Не описывать, а запрятать внутрь компилятора. Все равно тут идет >обращение к структурам (PPointer(Integer(Self) + vmtParent)^) которые
>елли не ошибаюсь) доступны для изменения только компилятору

Да. вы правы.
за это ответственен компилятор.


 
vpbar ©   (2007-10-11 16:08) [182]

>>oxffff ©   (11.10.07 16:05) [181]
Дело в том что я не вижу метаклассов в делфи. Они там виртуальные какие то - есть только на момент компиляции. Есть ссылка на класс class of, но метоклассом это я не считаю.

>>Здесь вся идеалогия, в том что создание экзепляра типа или операции над типом (например финализация, получение интерфейса и т.д.) делегирована ответственному за это объекту (метаклассу)
В данном случае метакласс - это TObject?


 
oxffff ©   (2007-10-11 16:09) [183]


>  В чём прикол class function?
>
> vpbar ©   (11.10.07 16:03) [180]
> >>vpbar ©   (11.10.07 15:55) [179]
> А костылями назвал, потомучто классовые методы TObject вроде
> ClassParent реализуют ОО модель языка, бессмысленны для
> переопределения и могли бы (и ИМХО так былобы логичнее)
> быть вынесены в грамматику.


Так если внести их в грамматику ничего же не поменяется.


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

vpbar ©   (11.10.07 16:08) [182]


> Дело в том что я не вижу метаклассов в делфи


То, что находится перед class of и есть метакласс (я так думаю (с))


 
oxffff ©   (2007-10-11 16:18) [185]


> vpbar ©   (11.10.07 16:08) [182]
> >>oxffff ©   (11.10.07 16:05) [181]
> Дело в том что я не вижу метаклассов в делфи. Они там виртуальные
> какие то - есть только на момент компиляции. Есть ссылка
> на класс class of, но метоклассом это я не считаю.


например
var a:Tclass;

A-Это и есть экземпляр метакласса.


> В данном случае метакласс - это TObject?


Нет.
Зайди в help Memory Management\Internal Data Formats найди Class Types.
Если хочешь понять досконально, то проследи под отладчиком все цепочку создания и разрушения объекта.


 
vpbar ©   (2007-10-11 16:24) [186]

>>oxffff ©   (11.10.07 16:09) [183]
Нуу. В частности поменяется ответ на oxffff ©   (11.10.07 15:16) [174]
Останутся только виртуальные классовые методы которые отвечают за выделение памяти. Т.е создание объекта.
А это "Все же их назначение работа с метаклассом." будет видно что работа с метаклассом (от тут один :) ) сводится к языковым средствам получения предка, имени класса т.е. того, что является частью модели ООП в делфи.


 
reonid ©   (2007-10-11 16:28) [187]

2vpbar ©   (11.10.07 16:08) [182]
Вы, насколько я подозреваю, никогда не работали со
списками классов (метаклассов) в дельфях.
Иногда, например, в списке классов нужно
выбрать первый, удовлетворяющий определённому критерию,
и создать экземпляр.
Например, поддерживающий определённую сигнатуру.
Для этого иногда полезно запросить у класса некоторую
виртуальную информацию до создания экземпляра.


 
oxffff ©   (2007-10-11 16:35) [188]


> reonid ©   (11.10.07 16:28) [187]
> 2vpbar ©   (11.10.07 16:08) [182]
> Вы, насколько я подозреваю, никогда не работали со
> списками классов (метаклассов) в дельфях.
> Иногда, например, в списке классов нужно
> выбрать первый, удовлетворяющий определённому критерию,
>
> и создать экземпляр.
> Например, поддерживающий определённую сигнатуру.
> Для этого иногда полезно запросить у класса некоторую
> виртуальную информацию до создания экземпляра.


И эта операция должна быть именно полиморфной (предоставление информации о типе).
Я согласен с тем, что в этом отношении это очень удобно.

Просто думаю, что - это было следствие Newinstance. Я не думаю, что в тот момент(давным давно) они это так продумали.
Почему, то они не захотели расширять структуру метакласса. И тогда достаточно было бы и невиртуального метода.


 
oxffff ©   (2007-10-11 16:41) [189]


> vpbar ©   (11.10.07 16:24) [186]
> >>oxffff ©   (11.10.07 16:09) [183]
> Нуу. В частности поменяется ответ на oxffff ©   (11.10.07
> 15:16) [174]
> Останутся только виртуальные классовые методы которые отвечают
> за выделение памяти. Т.е создание объекта.
> А это "Все же их назначение работа с метаклассом." будет
> видно что работа с метаклассом (от тут один :) ) сводится
> к языковым средствам получения предка, имени класса т.е.
>  того, что является частью модели ООП в делфи


Так невиртуальные методы не занимают слотов метакласса. Поскольку линкуются на этапе компиляции.
Но!!! Они работают с классом и должны находиться в class scope.
Я так думаю. Но даже если бы было бы, как предлагаете вы, то внутренне(технически) - это было бы тоже самое.


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


> Почему, то они не захотели расширять структуру метакласса.
>  И тогда достаточно было бы и невиртуального метода.


Ну в известном смысле виртуальный классовый метод ее расширяет.


 
vpbar ©   (2007-10-11 16:51) [191]

>>Игорь Шевченко ©   (11.10.07 16:18) [184]
>>oxffff ©   (11.10.07 16:18) [185]
Я понял это дуализм  - я считаю что это ссылка на класс и это так вы считаете что это метакласс и это так.

Т.е:
var AAA:Tclass; // где Tclass=clas of Tobject
AAA - ссылка на класс Tobject.


Мы можем присвоить ей другой класс совместимый с Tobject (его потомка). Можем вызвать невиртуальный классовый метод, который эквивалентен обычной процедуре с первым параметром - указателем на класс.
Можем вызвать виртуальный классовый метод - вот тут разногласие иногда обращение к этим методам идет через VMT (и насколько я помню это таже VMT что и для виртуальных методов экземпляра).
Единственное что методам экземпляра передается указатель на экземпляр (который указывает на указатель на VMT) а методам класса сразу указатель на VMT.
И единственно что я могу назвать тут метаклассом - это VMT. хотя это на мой взгляд странно.
>>Если хочешь понять досконально, то проследи под отладчиком все цепочку создания и разрушения объекта.
Да понял я, понял я


 
vpbar ©   (2007-10-11 16:55) [192]

>>oxffff ©   (11.10.07 16:41) [189]
>>Так невиртуальные методы не занимают слотов метакласса.
Вах какие новые термины. Но суть понятна. Видимо в [191] я пришол к правильному выводу что такое метакласс.


 
vpbar ©   (2007-10-11 16:58) [193]

>>reonid ©   (11.10.07 16:28) [187]
Ошибаетесь, бывало использовал  список указателей на класс.
"списками классов (метаклассов) в дельфях"
Так у вас класс и метакласс одно и тоже?


 
oxffff ©   (2007-10-11 16:59) [194]


> И единственно что я могу назвать тут метаклассом - это VMT.
>  хотя это на мой взгляд странно.


метакласс - это поля по отрицательному смещению от VMT  +связанные с этими полями структруы +все классовые методы. Если грубо классифицировать.
Причем классовые виртуальные и экземплярные виртуальные идут вперемешку.

-76
Pointer
pointer to virtual method table (or nil)

-72
Pointer
pointer to interface table (or nil)

-68
Pointer
pointer to Automation information table (or nil)

-64
Pointer
pointer to instance initialization table (or nil)

-60
Pointer
pointer to type information table (or nil)

-56
Pointer
pointer to field definition table (or nil)

-52
Pointer
pointer to method definition table (or nil)

-48
Pointer
pointer to dynamic method table (or nil)

-44
Pointer
pointer to short string containing class name

-40
Cardinal
instance size in bytes

-36
Pointer
pointer to a pointer to ancestor class (or nil)


 
vpbar ©   (2007-10-11 17:07) [195]

>>oxffff ©   (11.10.07 16:59) [194]
Ок. Наконец мне ответили как тут понимается термин "метаклас".
Просто я понимал термин метаклас несколько иначе. Так ка возможно в динамически языках. Когда метаклас может создавать класс во время выполнения. И класс является экземпляром метакласса.

В делфи же все классы заданы на момент компиляции. И делфийский метакласс совпадает с классом. Ведь по сути "поля по отрицательному смещению от VMT  +связанные с этими полями структруы +все классовые методы"  так же относятся и к классу.
Поэтому конструкцию class of мне удобно рассматривать как ссылку на  класс (VMT), которая позволяет ссылаться на класс и совместимые с ним классы и выбирать из, но не создавать.


 
reonid ©   (2007-10-11 17:11) [196]

2vpbar ©   (11.10.07 16:58) [193]
Термин "метакласс" для дельфи не родной,
а писать везде ссылка на класс слишком долго,
поэтому я использовал слово класс, и, чтобы избежать
недоразумений, подчеркнул, что я использую его
в смысле метакласс (или ссылка на класс).
Мне казалось, в контексте обсуждения это будет понятно.

>Ошибаетесь, бывало использовал  список указателей на класс.
Вы имеете ввиду список указателей на объекты (экземпляры)?


 
vpbar ©   (2007-10-11 17:22) [197]

>>reonid ©   (11.10.07 17:11) [196]

>>Вы имеете ввиду список указателей на объекты (экземпляры)?
Что имею то и...
"список указателей на класс."
Объект  - экземпляр класса.
Указатель на объект бессмысленен ибо сам объект указатель.
ЗЫ
Хоть в делфи запутанно кроме class есть еще object. Но
Но такое
"   _TObj = object

  protected
    procedure Init; virtual;
 
  public
    function VmtAddr: Pointer;

  end;"  (C) Vladimir Kladov, 2000-2003.

щас редко используется. Поэтому вы имели ввиду всетаки  под объектом экземпляр класса.


 
reonid ©   (2007-10-11 18:24) [198]

vpbar ©   (11.10.07 17:22) [197]
>сам объект указатель.
На самом объект - не указатель, а то, что на что тот указывает.
А переменную объектного типа правильнее было бы называть
ссылкой на объект. Просто для простоты слово "ссылка" обычно
опускают. (Как и я опустил её в словосочетании "ссылка на класс").

>Просто я понимал термин метаклас несколько иначе. Так ка возможно в >динамически языках. Когда метаклас может создавать класс во время >выполнения. И класс является экземпляром метакласса.

В самой среде Дельфи именно так организована возможность
подключения пакетов и добавления компонентов из них.
И то же самое можно сделать и в пользовательских приложениях.


 
oxffff ©   (2007-10-11 18:56) [199]


> vpbar ©   (11.10.07 17:07) [195]
> >>oxffff ©   (11.10.07 16:59) [194]
> Ок. Наконец мне ответили как тут понимается термин "метаклас".
>  
> Просто я понимал термин метаклас несколько иначе. Так ка
> возможно в динамически языках. Когда метаклас может создавать
> класс во время выполнения. И класс является экземпляром
> метакласса.


.Net может создавать класс на основе параметризованного класса в Run-time.


 
vpbar ©   (2007-10-11 19:50) [200]

>>oxffff ©   (11.10.07 18:56) [199]
Спасибо за инфу. Буду знать



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

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

Наверх




Память: 0.86 MB
Время: 0.034 c
15-1192360079
Актер
2007-10-14 15:07
2007.11.18
Спектакль


2-1193379623
Layner
2007-10-26 10:20
2007.11.18
Узнать, над каким элементом вызвали PopupMenu


2-1193297737
Ega23
2007-10-25 11:35
2007.11.18
Есть ли у контрола какое-нибудь состояние, типа Destoying?


2-1192608154
Ksander
2007-10-17 12:02
2007.11.18
TreeView


15-1192119954
Delphi User
2007-10-11 20:25
2007.11.18
Можно ли программно ВКЛЮЧАТЬ sata-винчестер ?