假设您有一个虚构的脚本语言类型系统,该语言是用C ++编写的(例如),脚本语言中的每个类型(和对象)在底层实现语言中都有相应的类型(和对象)。这个虚构类型系统中的基类是一个名为Object的类,所有其他类必须从这个类派生。现在,你有另一个名为HashTable的类,它是所有变量存储的基础(我可能说错了):名称空间是通过HashTables实现的(将一个对象与另一个对象相关联),全局变量通过HashTables存储,并且问题的关键点,实例变量也存储在HashTables中。
实例变量是这样的,每个Object都有一个HashTable,用于存储其实例变量。但是,HashTable必然派生自Object,因此每个HashTable都有一个HashTable,用于存储其实例变量。每个HashTable的每个HashTable都有一个HashTable,所以无限制地使用。
我的问题是,这种类型的系统能否在底层C ++代码中以面向对象的方式实现?如果没有采取预防措施,程序将进入一个无限循环,并在仅仅实例化一个Object时导致堆栈溢出,因为它将实例化一个HashTable,它将调用其Object的父构造函数,它将实例化一个HashTable ...... / p>
这个设计漏洞是否有任何可行的解决方法,不涉及破坏所需的OO设计(每种类型在底层代码中都有其推论类型)?
在这篇文章中原谅语法,英语不是我的第一语言,我可能没有以可理解的方式解释过。
答案 0 :(得分:0)
实现两种不同的HashTable类型:一种用于用户代码(UserHashTable),从Object派生,因此不违反您的“一切都是对象”规则,另一种用于内部使用(CoreHashTable)来实现您的类型系统。
[编辑] CoreHashTable可以自动转换为UserHashTable,例如UserHashTable可以包含指向CoreHashTable的内部智能指针。
答案 1 :(得分:0)
是。您可以使用其他编程语言模拟自己的“对象系统”。
这个概念被称为“虚拟对象系统”。
O.O。编程语言有自己的“对象系统”。通过“对象系统”,我不是指“O.O. libraries或O.O. Class hierarchy”。通过“对象系统”,我指的是声明和使用类和对象的方式。
但是,有时候,你的编程语言不是面向对象的,或者即使面向对象,也缺少一些东西。 C#和Java没有真正的属性和事件,C#和Object Pascal。
当O.O.开始,许多程序员使用非O.O.编程语言,并了解O.O.有些人制作了自己的“普通C”到“C ++”预处理器(可能是Objective-C),有些人做了完整的编译器。
有些人会模仿它们。程序员从概念上思考他正在使用类和对象,但是在代码中,使用结构和对象。指针。
我见过几个“虚拟对象系统”,其中一组类或对象是由另一种编程语言模拟的。
有一次,我使用了一个名为“Borland数据库引擎”的数据库连接工具,开发人员将数据读写到“数据库”,“表格”,“字段”等对象中。
一个着名的是GLib库(“GObject”是根对象),用于GNU / Linux的GNome可视化界面。它是在“普通C”中完成的,但是使用指针模拟对象和类。
更多信息: http://en.wikipedia.org/wiki/Gobject
你想在概念上使用一组对象,但是在代码中,你不会有一个概念类的类声明,但是,一些数据存储在哈希表中,使用另一个O.O.编程语言。是的,可以做到。