Форум: "Прочее";
Текущий архив: 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