Некорректный вопрос.
Метаклассы естественным образом возникают в чисто объектных class-based языках. Без них не получилось бы завершенного рекурсивного дизайна системы.
Гибридные языки могут брать их (или отдельные черты, как в дельфи) на вооружение для получения каких-то определенных преимуществ.
Здравствуйте, DarkGray, Вы писали:
DG>Что ты понимаешь под метаклассами?
Метакласс это стнглтон, являющийся наследственной виртуальной сущностью типа (не экземпляра объекта) и все принцыпы ООП распространяются и на него.
Это удобно когда работаешь с иерархией классов и приведение от базового типа, вызов конструкторов и class virtual методов как без создания экземпляра класса так и из него.
Если на данном например в Net С++ у класса могут существовать только статические методы и переменные, то метакласс вводит понятие виртуальных статических методов и переменных таких же как и для экземпляров типа но общие для данного типа
Те кто работал с Delphi знают и применяют так или иначе виртуальные конструкторы, статические виртуальные методы (class virtual) и конструкции языка типа
TVirtClass = class of TBaseVirtClass.
В Delphi метакласс это ссылка на VMT и все виртуальные методы класса (не экземпляра класса) располагаются с отрицательным смещением
И все метаклассы наследуются от
TClass= class of TObject.
{ Virtual method table entries }
Так не зная точного типа а только имея ссылку на него можно вызывать виртуальные конструкторы и методы класса.
И добавление виртуальных методов класса идет за счет расширения VMT в отрицательную сторону.
Но вводить переменные метакласса в Delphi нельзя.
Интересно как вышли из положения отсутствия метаклассов в Net в Delphi http://www.rsdn.ru/Forum/Message.aspx?mid=548308&only=1
Но опять же проблема определения данных классов не определена и доступ к метаклассу из объекта идет через хэш таблицу, а по идее адрес метакласса должен быть прописан в VMT.
typeof и GetType из Net возвращает по сути тот же метакласс, но он вопервых не типизирован и только переопределяет виртуальные методы базового класса Type и нет возможности его расширения.
Для меня лично необходимость метаклассов не оспорима, но интересно как к этому относится программистское сообщество. И может лишний раз заострить внимание на этой проблеме разработчиков компиляторов и сред.
и солнце б утром не вставало, когда бы не было меня
Кстати в Net существуют поля readonly значение которого можно определять только в конструкторе. Если для метакласса создать конструктор по умолчанию и ввести такие переменные как поля метаклассов, то такие поля можно было бы вынести из объекта в метакласс тем самым уменьшая расход памяти (но увеличивая время на доступ)
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, DarkGray, Вы писали:
DG>>Что ты понимаешь под метаклассами? S> Метакласс это стнглтон, являющийся наследственной виртуальной сущностью типа (не экземпляра объекта) и все принцыпы ООП распространяются и на него.
Какое-то сумасшедшее у тебя определение.
Метакласс это всего-лишь навсего класс, чьим экземпляром является класс обычных объектов.
Является ли он синглтоном — вовсе не обязательно. И к наследованию c виртуальностью имеет такое же отношение как и объект. Собственно в объектной системе все является объектом, в том числе и класс. Поэтому все свойства объекта, включая наличие класса должны быть ему свойственны.
Здравствуйте, _vovin, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, DarkGray, Вы писали:
DG>>>Что ты понимаешь под метаклассами? S>> Метакласс это стнглтон, являющийся наследственной виртуальной сущностью типа (не экземпляра объекта) и все принцыпы ООП распространяются и на него.
_>Какое-то сумасшедшее у тебя определение. _>Метакласс это всего-лишь навсего класс, чьим экземпляром является класс обычных объектов. _>Является ли он синглтоном — вовсе не обязательно. И к наследованию c виртуальностью имеет такое же отношение как и объект. Собственно в объектной системе все является объектом, в том числе и класс. Поэтому все свойства объекта, включая наличие класса должны быть ему свойственны.
_>--
_>Владимир.
В данном случае я высказал свое видение метакласса как неотемлеммой части типа. А он должен быть как раз синглтоном.
Если взять Net то для класса существует методы и поля с директивой static, но толку от них мало когда работаем с неизвестным типом, в том числе они и ненаследуемы.
При введении понятия метакласса можно ввести директиву metaclass для полей и методов в том числе и для конструктора метакласса по умолчанию без параметров. И конструирование метакласса неотемлемо от типа как и объекта
Сам же метакласс наследуется от метакласса предка итд. А общим предком может быть Type.
Но у него не может быть метакласса что бы не было рекурсивности поэтому он необычный класс, в том числе и ссылка на него должна хранится в VMT для быстрого доступа к нему из объекта. И по всем вышеописанным причинам должен быть синглтоном.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали:
А>>Неее... А>>Такие метаклассы не нужны! S> Аргументируй!!!!
Да твое определение — это сплошная каша.
Причем тут сингелтоны, VMT и прочие вещи?
Ты бы для начала прочитал что-нибудь внятное, что такое метакласс,
и вообще, что означает "мета" применительно к понятиям...
В С++, к примеру, к метаклассам ближе всего шаблоны.
Экземпляром (instance) шаблона является класс.
Экземпляром класса — объект.
В общем метакласс — это просто другой порядок абстракции...
Можно говорить о метаметаклассах, о метаметаметаклассах и далее...
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, <Аноним>, Вы писали:
А>>>Неее... А>>>Такие метаклассы не нужны! S>> Аргументируй!!!!
А>Да твое определение — это сплошная каша. А>Причем тут сингелтоны, VMT и прочие вещи? А>Ты бы для начала прочитал что-нибудь внятное, что такое метакласс, А>и вообще, что означает "мета" применительно к понятиям...
SOM http://os2.in.ru/rdm2/articles/som1.html А>В С++, к примеру, к метаклассам ближе всего шаблоны. А>Экземпляром (instance) шаблона является класс. А>Экземпляром класса — объект.
И чем шаблон отличается от класса, только тем что он раскрывается во врея компиляции????
А>В общем метакласс — это просто другой порядок абстракции... А>Можно говорить о метаметаклассах, о метаметаметаклассах и далее...
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Re[9]: Нужны ли метаклассы????
От:
Аноним
Дата:
11.03.04 15:30
Оценка:
В общем, чтобы нормально перейти на новый уровень абстракции (метаклассы),
стоит немного абстрагироваться от деталей реализации...
Здравствуйте, <Аноним>, Вы писали:
А>В общем, чтобы нормально перейти на новый уровень абстракции (метаклассы), А>стоит немного абстрагироваться от деталей реализации...
Вернее будет сказать о виртуальности класса. Это самое подходящее определение.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
S>>то такие поля можно было бы вынести из объекта в метакласс тем самым уменьшая
M>Readonly ещё не значит, что для всех экземпляров он одинаковый.
Молодец а я думал когда наконец то обратят на это внимание.
Я имел ввиду такие конструкции
public readonly int икс=0;
То есть одинаковые значения поля для всех экземпляров класса. То есть если мы заранее знаем, что что для всех экземпляров эти данные будут одинаковы то мы можем вынести эти данные в метакласс.
Прошу прощение за неправильные высказывания. 9 марта было однако.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали:
А>>Здравствуйте, Serginio1, Вы писали:
S>>>Здравствуйте, <Аноним>, Вы писали:
А>>>>Неее... А>>>>Такие метаклассы не нужны! S>>> Аргументируй!!!!
А>>Да твое определение — это сплошная каша. А>>Причем тут сингелтоны, VMT и прочие вещи? А>>Ты бы для начала прочитал что-нибудь внятное, что такое метакласс, А>>и вообще, что означает "мета" применительно к понятиям...
В Smalltalk метаклассы присутствуют уже лет тридцать.
Сделано там как всегда все просто в духе рекурсивного дизайна.
Каждый объект имеет класс. Класс это тоже объект, который может обладать своими переменными и методами. Соответственно у класса как объекта тоже должен быть свой класс, хранящий информацию о его строении. Такой класс назван метаклассом. Никаких новых сущностей больше придумывать и не нужно. Класс, как любой полноценный объект, получает все преимущества от рождения — переменные экземпляра (класс это экземпляр потомка класса Class), методы (нормальные методы объекта, а статические процедуры, не имеющие this), полиморфизм и т.д.
Соответственно для шаблона Factory не нужно придумывать ничего лишнего:
_
S>> Например Python S>> http://www.getinfo.ru/article357.html
S>> Про Delphi уже писал. S>> Но еще S>> http://gurin.tomsknet.ru/delphiobjectinspector.html
S>> Smalltalk S>> http://www.math.rsu.ru/smalltalk/sml-b.ru.html
_>В Smalltalk метаклассы присутствуют уже лет тридцать. _>Сделано там как всегда все просто в духе рекурсивного дизайна. _>Каждый объект имеет класс. Класс это тоже объект, который может обладать своими переменными и методами. Соответственно у класса как объекта тоже должен быть свой класс, хранящий информацию о его строении. Такой класс назван метаклассом. Никаких новых сущностей больше придумывать и не нужно. Класс, как любой полноценный объект, получает все преимущества от рождения — переменные экземпляра (класс это экземпляр потомка класса Class), методы (нормальные методы объекта, а статические процедуры, не имеющие this), полиморфизм и т.д.
В общем мы говорим об одном и том же. И странно что метаклассов нет в Net (вернее он есть Type но не расширяемый). Из за этого в общем то и мой вопрос.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Дело в том, что он начитался споров о важности "виртуальных статических методов" (которые есть в Дельфи) и не может понять как рефлекшон в дотнете (да и не только) может жить без них.
Ну, и естествнно, что при таком подходе в понятие "мета" вкладывается только матаданные в рантайме. Про то, что их можно исползовать и в других стадиях (дизайнтайм, компайлтайм) он просто не задумывлася.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
_ _>В Smalltalk метаклассы присутствуют уже лет тридцать. _>Сделано там как всегда все просто в духе рекурсивного дизайна. _>Каждый объект имеет класс. Класс это тоже объект, который может обладать своими переменными и методами. Соответственно у класса как объекта тоже должен быть свой класс, хранящий информацию о его строении. Такой класс назван метаклассом. Никаких новых сущностей больше придумывать и не нужно. Класс, как любой полноценный объект, получает все преимущества от рождения — переменные экземпляра (класс это экземпляр потомка класса Class), методы (нормальные методы объекта, а статические процедуры, не имеющие this), полиморфизм и т.д.
_>Соответственно для шаблона Factory не нужно придумывать ничего лишнего: _>