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

Вниз

В чём прикол 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.85 MB
Время: 0.062 c
1-1188216598
временный Чайник
2007-08-27 16:09
2007.11.18
Как в Viste удалить файл в Program Files


15-1192701498
zdm
2007-10-18 13:58
2007.11.18
перехват нажатия


2-1193330363
Винни-Пух-Пух-Пух
2007-10-25 20:39
2007.11.18
Почему могут не показываться Hint ы на контролах ?


2-1193392869
Delphi_Beginer
2007-10-26 14:01
2007.11.18
Массив как возвращаемый параметр


2-1193385053
Андрей
2007-10-26 11:50
2007.11.18
Положение курсора.





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