2

假设您有一个虚构的类型系统,用于用 C++ 编写的虚构脚本语言(例如),并且脚本语言中的每个类型(和对象)在底层实现语言中都有对应的类型(和对象)。这个假想的类型系统中的基类是一个名为 Object 的类,所有其他类都必须派生自这个类。现在,您有另一个名为 HashTable 的类,它是所有变量存储的基础(我可能说错了):命名空间通过 HashTables 实现(将一个对象与另一个对象关联),全局变量通过 HashTables 存储,并且,问题的关键,实例变量也存储在HashTables中。

实例变量是这样的,每个对象都有一个 HashTable 来存储它的实例变量。但是,HashTable 必然是从 Object 派生的,因此每个 HashTable 都有一个 HashTable 来存储其实例变量。每个 HashTable 的每个 HashTable 都有一个 HashTable,以此类推。

我的问题是,这种类型系统可以在底层 C++ 代码中以面向对象的方式实现吗?如果不采取任何预防措施,程序将进入一个无限循环并在仅仅实例化对象时导致堆栈溢出,因为它将实例化一个哈希表,该哈希表将调用其父对象的构造函数,这将实例化一个哈希表......

对于这个设计缺陷,是否有任何可行的解决方法,不涉及破坏所需的 OO 设计(每种类型在底层代码中都有其推论类型)?

请原谅这篇文章中的语法,英语不是我的第一语言,我可能无法以可理解的方式解释某些内容。

4

2 回答 2

0

实现两种不同的 HashTable 类型:一种用于用户代码(UserHashTable),从 Object 派生,因此不会违反您的“一切都是对象”规则,另一种用于内部使用(CoreHashTable)来实现您的类型系统。

[编辑] CoreHashTable 可以自动转换为 UserHashTable,例如 UserHashTable 可以包含指向 CoreHashTable 的内部智能指针。

于 2011-01-16T00:26:16.910 回答
0

是的。您可以使用另一种编程语言来模拟您自己的“对象系统”。

该概念称为“虚拟对象系统”。

OO 编程语言有自己的“对象系统”。我所说的“对象系统”并不是指“OO 库或 OO 类层次结构”。“对象系统”是指它声明和使用类和对象的方式。

但是,有时,您的编程语言不是面向对象的,或者即使它是面向对象的,也缺少一些东西。C# 和 Java 没有真正的属性和事件,C# 和 Object Pascal 有。

当 OO 开始时,许多程序员使用非 OO 编程语言,并了解 OO 一些人自己制作“普通 C”到“C++”预处理器(也许是 Objective-C),一些人做了完整的编译器。

有些人效仿他们。程序员,从概念上讲,他正在使用类和对象,但是在代码中,使用结构和指针。

我见过几个“虚拟对象系统”,其中一组类或对象由另一种编程语言模拟。

有一次,我使用了一个名为“Borland Database Engine”的数据库连接工具,开发人员可以在其中将数据读写到“数据库”、“表”、“字段”等对象中。

一个著名的是 GLib 库(“GObject”是根对象),用于 GNU/Linux 的 GNome 可视界面。它在“普通 C”中完成,但使用指针模拟对象和类。

更多信息: http ://en.wikipedia.org/wiki/Gobject

从概念上讲,您想使用一组对象,但在代码中,您的概念类不会有类声明,而是使用另一种 OO 编程语言存储在哈希表中的一些数据。是的,它可以做到。

于 2011-04-01T17:16:10.363 回答