Может ли объектно-ориентированная система типов быть реализована языком с объектно-ориентированной системой типов? - PullRequest
1 голос
/ 16 января 2011

Предположим, у вас есть система мнимых типов для мнимого языка сценариев, который написан на C ++ (например), и каждый тип (и объект) в языке сценариев имеет соответствующий тип (и объект) в базовом языке реализации. Базовый класс в этой воображаемой системе типов - это класс с именем Object, и все другие классы должны быть производными от этого класса. Теперь у вас есть другой класс с именем HashTable, который является основой для хранения всех переменных (я мог бы сказать, что это неправильно): пространства имен реализуются через HashTables (связывание одного объекта с другим объектом), глобальные переменные хранятся через HashTables, и, чтобы Суть проблемы, переменные экземпляра также хранятся в HashTables.

Переменные экземпляра таковы, что у каждого объекта есть HashTable, в котором хранятся его переменные экземпляра. Однако HashTable обязательно происходит от Object, поэтому у каждого HashTable есть HashTable, в котором хранятся переменные его экземпляра. И каждый HashTable для каждого HashTable имеет HashTable и так далее до бесконечности.

Мой вопрос: может ли эта система типов быть реализована объектно-ориентированным способом в базовом коде C ++? Если никакие меры предосторожности не приняты, программа войдет в бесконечный цикл и вызовет переполнение стека при простом создании экземпляра объекта, поскольку она будет создавать экземпляр HashTable, который вызовет свой родительский конструктор для объекта, который будет создавать экземпляр HashTable ...

Существуют ли какие-либо жизнеспособные обходные пути для этого недостатка проекта, которые не включают в себя нарушение требуемого дизайна ОО (каждый тип имеет свой тип следствия в базовом коде)?

Извините грамматику в этом посте, английский не мой родной язык, и я, возможно, не объяснил бы что-то понятным образом.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Да. Вы можете эмулировать свою собственную "объектную систему" с другим языком программирования.

Эта концепция называется "системой виртуальных объектов".

o.o. Языки программирования имеют свою «Систему объектов». Под «Системой объектов» я не имею в виду «библиотеки OOO или иерархия классов OOO». Под «Системой объектов» я подразумеваю способ объявления и использования классов и объектов.

Но иногда ваш язык программирования не объектно-ориентирован, или даже если он объектно-ориентирован, некоторые вещи отсутствуют. C # и Java не имеют реальных свойств и событий, C # и Object Pascal имеют.

Когда О.О. многие программисты используют не O.O. языки программирования и узнайте об О.О. Некоторые делают свои собственные препроцессоры с «простого C» на «C ++» (возможно Objective-C), некоторые делают полные компиляторы.

И некоторые подражают им. Программист, думая концептуально, он использовал классы и объекты, но в коде использовал структуры и указатели.

Я видел несколько «виртуальных объектных систем», где группа классов или объектов моделируется другим языком программирования.

Однажды я работал с инструментом связности баз данных под названием «Borland Database Engine», где разработчики считывали и записывали данные в такие объекты, как «базы данных», «таблицы», «поля».

Одна известная библиотека GLib («GObject» является корневым объектом), используемая в визуальном интерфейсе GNome для GNU / Linux. Это сделано в "обычном C", но имитирует объекты и классы, используя указатели.

Подробнее: http://en.wikipedia.org/wiki/Gobject

Вы хотите использовать концептуально группу объектов, но в коде у вас не будет объявления класса для вашего концептуального класса, но некоторые данные будут храниться в хеш-таблицах с использованием другого O.O. язык программирования. Да, это может быть сделано.

0 голосов
/ 16 января 2011

реализуют два разных типа HashTable: один для пользовательского кода (UserHashTable), производный от Object и, таким образом, не нарушающий правило «все есть объект», и другой для внутреннего использования (CoreHashTable) для реализации вашей системы типов.

[EDIT] CoreHashTable может быть автоматически преобразован в UserHashTable, например, UserHashTable может содержать внутренний интеллектуальный указатель на CoreHashTable.

...