Re[2]: Нужны ли метаклассы????
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.03.04 10:19
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Что ты понимаешь под метаклассами?

Метакласс это стнглтон, являющийся наследственной виртуальной сущностью типа (не экземпляра объекта) и все принцыпы ООП распространяются и на него.
Это удобно когда работаешь с иерархией классов и приведение от базового типа, вызов конструкторов и class virtual методов как без создания экземпляра класса так и из него.
Если на данном например в Net С++ у класса могут существовать только статические методы и переменные, то метакласс вводит понятие виртуальных статических методов и переменных таких же как и для экземпляров типа но общие для данного типа
Те кто работал с Delphi знают и применяют так или иначе виртуальные конструкторы, статические виртуальные методы (class virtual) и конструкции языка типа
TVirtClass = class of TBaseVirtClass.
В Delphi метакласс это ссылка на VMT и все виртуальные методы класса (не экземпляра класса) располагаются с отрицательным смещением
И все метаклассы наследуются от
TClass= class of TObject.
{ Virtual method table entries }

vmtSelfPtr = -76;
vmtIntfTable = -72;
vmtAutoTable = -68;
vmtInitTable = -64;
vmtTypeInfo = -60;
vmtFieldTable = -56;
vmtMethodTable = -52;
vmtDynamicTable = -48;
vmtClassName = -44;
vmtInstanceSize = -40;
vmtParent = -36;
vmtSafeCallException = -32 deprecated; // don't use these constants.
vmtAfterConstruction = -28 deprecated; // use VMTOFFSET in asm code instead
vmtBeforeDestruction = -24 deprecated;
vmtDispatch = -20 deprecated;
vmtDefaultHandler = -16 deprecated;
vmtNewInstance = -12 deprecated;
vmtFreeInstance = -8 deprecated;
vmtDestroy = -4 deprecated;

Так не зная точного типа а только имея ссылку на него можно вызывать виртуальные конструкторы и методы класса.
И добавление виртуальных методов класса идет за счет расширения VMT в отрицательную сторону.
Но вводить переменные метакласса в Delphi нельзя.
Интересно как вышли из положения отсутствия метаклассов в Net в Delphi
http://www.rsdn.ru/Forum/Message.aspx?mid=548308&only=1
Автор: Serginio1
Дата: 24.02.04

http://www.rsdn.ru/Forum/Message.aspx?mid=558365&only=1
Автор: Serginio1
Дата: 03.03.04

http://www.rsdn.ru/Forum/Message.aspx?mid=559531&only=1
Автор: Serginio1
Дата: 04.03.04


Но опять же проблема определения данных классов не определена и доступ к метаклассу из объекта идет через хэш таблицу, а по идее адрес метакласса должен быть прописан в VMT.
typeof и GetType из Net возвращает по сути тот же метакласс, но он вопервых не типизирован и только переопределяет виртуальные методы базового класса Type и нет возможности его расширения.
Для меня лично необходимость метаклассов не оспорима, но интересно как к этому относится программистское сообщество. И может лишний раз заострить внимание на этой проблеме разработчиков компиляторов и сред.
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.