Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали:
А>>Неее... А>>Такие метаклассы не нужны! S> Аргументируй!!!!
Да твое определение — это сплошная каша.
Причем тут сингелтоны, VMT и прочие вещи?
Ты бы для начала прочитал что-нибудь внятное, что такое метакласс,
и вообще, что означает "мета" применительно к понятиям...
В С++, к примеру, к метаклассам ближе всего шаблоны.
Экземпляром (instance) шаблона является класс.
Экземпляром класса — объект.
В общем метакласс — это просто другой порядок абстракции...
Можно говорить о метаметаклассах, о метаметаметаклассах и далее...
Здравствуйте, mihailik, Вы писали:
S>>то такие поля можно было бы вынести из объекта в метакласс тем самым уменьшая
M>Readonly ещё не значит, что для всех экземпляров он одинаковый.
Молодец а я думал когда наконец то обратят на это внимание.
Я имел ввиду такие конструкции
public readonly int икс=0;
То есть одинаковые значения поля для всех экземпляров класса. То есть если мы заранее знаем, что что для всех экземпляров эти данные будут одинаковы то мы можем вынести эти данные в метакласс.
Прошу прощение за неправильные высказывания. 9 марта было однако.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Некорректный вопрос.
Метаклассы естественным образом возникают в чисто объектных 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 и прочие вещи? А>Ты бы для начала прочитал что-нибудь внятное, что такое метакласс, А>и вообще, что означает "мета" применительно к понятиям...
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 >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, 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 не нужно придумывать ничего лишнего: _>
Здравствуйте, VladD2, Вы писали:
VD>Дело в том, что он начитался споров о важности "виртуальных статических методов" (которые есть в Дельфи) и не может понять как рефлекшон в дотнете (да и не только) может жить без них.
VD>Ну, и естествнно, что при таком подходе в понятие "мета" вкладывается только матаданные в рантайме. Про то, что их можно исползовать и в других стадиях (дизайнтайм, компайлтайм) он просто не задумывлася.
Ты не прав в том, что рефлекшон как раз и устроен на метаклассе, но его не достаточные возможности в том, что он не использует наследование, а только переопределяет виртуальные методы Type.
В том числе и энную часть атирибутов можно выносить в метаклассы, если они будут использоваться во всей иерархии классов.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>При введении понятия метакласса можно ввести директиву metaclass для полей и методов в том числе и для конструктора метакласса по умолчанию без параметров. И конструирование метакласса неотемлемо от типа как и объекта S> Сам же метакласс наследуется от метакласса предка итд. А общим предком может быть Type. S>Но у него не может быть метакласса что бы не было рекурсивности поэтому он необычный класс, в том числе и ссылка на него должна хранится в VMT для быстрого доступа к нему из объекта. И по всем вышеописанным причинам должен быть синглтоном.
В рекурсивной системе (например, Smalltalk) это выглядит так.
Пусть на вершине иерархии объектов находится класс Object.
Параллельно иерархии объектов существует иерархия метаклассов, возглавляемая классом Class. (Class — это метакласс Object).
Поскольку система рекурсивная, то Class имеет своё место в иерархии объектов. И, попросту, он является потомком Object.
Язык (C++, Delphi, Smalltalk) позволяет писать пользовательские классы — т.е. изменять структуру экземпляра.
Также можно писать пользовательские метаклассы (определять методы класса) (в С++ нет динамического полиморфизма в метаклассах).
Но метаклассы второго порядка уже недоступны для рукоделия.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Serginio1, Вы писали:
S>>При введении понятия метакласса можно ввести директиву metaclass для полей и методов в том числе и для конструктора метакласса по умолчанию без параметров. И конструирование метакласса неотемлемо от типа как и объекта S>> Сам же метакласс наследуется от метакласса предка итд. А общим предком может быть Type. S>>Но у него не может быть метакласса что бы не было рекурсивности поэтому он необычный класс, в том числе и ссылка на него должна хранится в VMT для быстрого доступа к нему из объекта. И по всем вышеописанным причинам должен быть синглтоном.
К>В рекурсивной системе (например, Smalltalk) это выглядит так.
К>Пусть на вершине иерархии объектов находится класс Object. К>Параллельно иерархии объектов существует иерархия метаклассов, возглавляемая классом Class. (Class — это метакласс Object). К>Поскольку система рекурсивная, то Class имеет своё место в иерархии объектов. И, попросту, он является потомком Object.
К>Язык (C++, Delphi, Smalltalk) позволяет писать пользовательские классы — т.е. изменять структуру экземпляра. К>Также можно писать пользовательские метаклассы (определять методы класса) (в С++ нет динамического полиморфизма в метаклассах). К>Но метаклассы второго порядка уже недоступны для рукоделия.
К>Поэтому метакласс любого метакласса — это Class.
Мы все об одном и том же только разными словами. Раз есть наследование метаклассов, то должна быть возможность и определения полей ,данных метакласса, т.к. он ничем не отличается от обычного объекта. И введение их в Net лично я считаю необходимо, поэтому и задал этот вопрос. Большинство отвечает: "зачем т.к. Type и рефлексии вполне хватает", я не согласен.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Кодт, Вы писали:
К>>В рекурсивной системе (например, Smalltalk) это выглядит так.
К>>Пусть на вершине иерархии объектов находится класс Object. К>>Параллельно иерархии объектов существует иерархия метаклассов, возглавляемая классом Class. (Class — это метакласс Object). К>>Поскольку система рекурсивная, то Class имеет своё место в иерархии объектов. И, попросту, он является потомком Object.
К>>Язык (C++, Delphi, Smalltalk) позволяет писать пользовательские классы — т.е. изменять структуру экземпляра. К>>Также можно писать пользовательские метаклассы (определять методы класса) (в С++ нет динамического полиморфизма в метаклассах). К>>Но метаклассы второго порядка уже недоступны для рукоделия.
К>>Поэтому метакласс любого метакласса — это Class.
S> Мы все об одном и том же только разными словами. Раз есть наследование метаклассов, то должна быть возможность и определения полей ,данных метакласса, т.к. он ничем не отличается от обычного объекта. И введение их в Net лично я считаю необходимо, поэтому и задал этот вопрос. Большинство отвечает: "зачем т.к. Type и рефлексии вполне хватает", я не согласен.
Ты правильно рассуждаешь.
Но такая логика действует, если действительно задаться целью создать целостную законченную объектную систему.
А .NET по всем признакам создавалась прежде всего как прагматичная система. Т.е. нужна фича — добавим фичу.
В итоге нет особых бонусов, возникающих как при использовании, например, системы с описанным рекурсивным дизайном.
Если угодно это "Фичиризм vs Полнота концепции".
Здравствуйте, _vovin, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, Кодт, Вы писали:
К>>>В рекурсивной системе (например, Smalltalk) это выглядит так.
К>>>Пусть на вершине иерархии объектов находится класс Object. К>>>Параллельно иерархии объектов существует иерархия метаклассов, возглавляемая классом Class. (Class — это метакласс Object). К>>>Поскольку система рекурсивная, то Class имеет своё место в иерархии объектов. И, попросту, он является потомком Object.
К>>>Язык (C++, Delphi, Smalltalk) позволяет писать пользовательские классы — т.е. изменять структуру экземпляра. К>>>Также можно писать пользовательские метаклассы (определять методы класса) (в С++ нет динамического полиморфизма в метаклассах). К>>>Но метаклассы второго порядка уже недоступны для рукоделия.
К>>>Поэтому метакласс любого метакласса — это Class.
S>> Мы все об одном и том же только разными словами. Раз есть наследование метаклассов, то должна быть возможность и определения полей ,данных метакласса, т.к. он ничем не отличается от обычного объекта. И введение их в Net лично я считаю необходимо, поэтому и задал этот вопрос. Большинство отвечает: "зачем т.к. Type и рефлексии вполне хватает", я не согласен.
_>Ты правильно рассуждаешь. _>Но такая логика действует, если действительно задаться целью создать целостную законченную объектную систему. _>А .NET по всем признакам создавалась прежде всего как прагматичная система. Т.е. нужна фича — добавим фичу. _>В итоге нет особых бонусов, возникающих как при использовании, например, системы с описанным рекурсивным дизайном. _>Если угодно это "Фичиризм vs Полнота концепции".
Интересно, что в Net одним из ее создателей считается Хэйлсберг, но в он же и создатель Delphi, а метаклассы в Delphi играют огромную роль и практически все завязано на них. Кроме того Net считается многоязыковой платформой и многие языки используют метаклассы.
Кстати раз видел проект помоему на Smalltalk for Net интересно было бы покапаться в Smalltalk коде через рефлектор. Может у тебя где нибудь есть ссылочка????
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Интересно, что в Net одним из ее создателей считается Хэйлсберг, но в он же и создатель Delphi, а метаклассы в Delphi играют огромную роль и практически все завязано на них. Кроме того Net считается многоязыковой платформой и многие языки используют метаклассы. S> Кстати раз видел проект помоему на Smalltalk for Net интересно было бы покапаться в Smalltalk коде через рефлектор. Может у тебя где нибудь есть ссылочка????
У меня складывается ощущение, что сейчас приходиться выбирать из двух крайностей.
Основная польза от классов ИМХО — возможность задания ограничений, т.е. программно декларировать методы работы с куском кода(класса), при выполнении которого он не рухнет.
И нам приходится выбирать из
1. "ОО" языки с ограничениями. Но там их слишком много и менять их нельзя.
2. "Не ОО" и "Истинно ОО" языки, что примерно одно и то же, — без ограничений. Smalltalk, Lua, прочие скриптовые языки. Другая крайность — можно все. Приходится проверять условия в Runtime, и т.д. и т.п.
Неужели не может быть языка с гибкостью на уровне smalltalk и с системой ограничений уровня c++/Java/Eiffel?
Здравствуйте, _vovin, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
S>> Интересно, что в Net одним из ее создателей считается Хэйлсберг, но в он же и создатель Delphi, а метаклассы в Delphi играют огромную роль и практически все завязано на них. Кроме того Net считается многоязыковой платформой и многие языки используют метаклассы. S>> Кстати раз видел проект помоему на Smalltalk for Net интересно было бы покапаться в Smalltalk коде через рефлектор. Может у тебя где нибудь есть ссылочка????
_>http://www.refactory.com/Software/SharpSmalltalk/ _>Думаю ничего особенно интересного ты там не увидишь. _>На выходе все равно все тот же MSIL получается.
Ну не скажи достаточно сложная иерархия
например
public class Object class : Class
public class Class : Object
public class Object : Root$
public class Root$
public static Root$ DNU 1(Root$, Root$, MethodBase);