2

たとえば、C++ で記述された架空のスクリプト言語用の架空の型システムがあり、スクリプト言語の各型 (およびオブジェクト) が、基になる実装言語に対応する型 (およびオブジェクト) を持っているとします。この架空の型システムの基本クラスは Object と呼ばれるクラスであり、他のすべてのクラスはこのクラスから派生する必要があります。これで、すべての変数ストレージの基礎となる HashTable と呼ばれる別のクラスができました (間違っていると言ったかもしれません)。問題のポイントは、インスタンス変数も HashTables に格納されていることです。

インスタンス変数は、すべてのオブジェクトがそのインスタンス変数を格納する HashTable を持つようなものです。ただし、HashTable は必ず Object から派生するため、各 HashTable にはインスタンス変数を格納する HashTable があります。そして、すべての HashTable のすべての HashTable には HashTable があります。

私の質問は、この型システムを基になる C++ コードでオブジェクト指向の方法で実装できるかということです。予防策を講じないと、プログラムは無限ループに入り、Object の単なるインスタンス化でスタック オーバーフローを引き起こします。これは、HashTable をインスタンス化する Object の親コンストラクターを呼び出す HashTable をインスタンス化するためです...

目的の OO 設計を壊すことを伴わない、この設計上の欠陥に対する実行可能な回避策はありますか?

この投稿の文法についてはご容赦ください。英語は私の母国語ではないため、わかりやすい方法で何かを説明できていない可能性があります。

4

2 に答える 2

0

2 つの異なる HashTable 型を実装します。1 つはユーザー コード用 (UserHashTable) で、Object から派生しているため、「すべてが Object である」という規則に違反しません。もう 1 つは型システムを実装するための内部使用 (CoreHashTable) です。

[編集] CoreHashTable は自動的に UserHashTable に変換できます。たとえば、UserHashTable には CoreHashTable への内部スマート ポインターを含めることができます。

于 2011-01-16T00:26:16.910 に答える
0

はい。独自の「オブジェクト システム」を別のプログラミング言語でエミュレートできます。

その概念は「仮想オブジェクト システム」と呼ばれます。

オブジェクト指向プログラミング言語には、独自の「オブジェクト システム」があります。「オブジェクト システム」とは、「OO ライブラリまたは OO クラス階層」を意味するものではありません。「オブジェクト システム」とは、クラスとオブジェクトを宣言して使用する方法を意味します。

しかし、プログラミング言語がオブジェクト指向ではない場合や、オブジェクト指向であっても、一部が欠けている場合があります。C# と Java には実際のプロパティとイベントがありませんが、C# と Object Pascal にはあります。

OO が始まったとき、多くのプログラマーは非 OO プログラミング言語を使用し、OO について学びました。独自の「プレーン C」から「C++」へのプリプロセッサー (Objective-C など) を作成したり、完全なコンパイラーを作成したりしました。

そして、それらをエミュレートする人もいます。プログラマーは、概念的には、クラスとオブジェクトを使用していると考えていましたが、コードでは構造体とポインターを使用していました。

クラスまたはオブジェクトのグループが別のプログラミング言語によってシミュレートされる「仮想オブジェクト システム」をいくつか見てきました。

以前、私は「Borland Database Engine」と呼ばれるデータベース接続ツールを使用しました。このツールでは、開発者はデータを「データベース」、「テーブル」、「フィールド」などのオブジェクトに読み書きします。

有名なものの 1 つは、GNU/Linux の GNome ビジュアル インターフェイスで使用される GLib ライブラリ ("GObject" がルート オブジェクト) です。これは「プレーン C」で行われますが、ポインターを使用してオブジェクトとクラスをシミュレートします。

詳細: http://en.wikipedia.org/wiki/Gobject

概念的に言えば、オブジェクトのグループを使用したいのですが、コードでは、概念クラスのクラス宣言はありませんが、別の OO プログラミング言語を使用してハッシュ テーブルに格納されたデータがあります。はい、できます。

于 2011-04-01T17:16:10.363 に答える