10

私はCommonLisp(Lispworksを使用)を勉強していて、今クラスシステムに入ろうとしています。標準オブジェクトと呼ばれるクラスがあり、次のように定義されています。

クラスstandard-objectは、standard-classのインスタンスであり、それ自体を除くstandard-classのインスタンスであるすべてのクラスのスーパークラスです。

http://www.lispworks.com/documentation/HyperSpec/Body/t_std_ob.htm#standard-objectから取得)したがって、これは標準クラスのインスタンスです。

一方、standard-classstandard-objectのサブクラスです。

>(subtypep 'standard-class 'standard-object)
=>T, T

標準オブジェクトを標準クラスのスーパークラスにすると同時に、そのインスタンスにする方法はありますか?標準クラスをサブタイプとして定義する場合、そのスーパータイプ(標準オブジェクトなど)の定義後に定義する必要があります。スーパークラスがインスタンスになるのはどうしてですか?または私の論理はちょうど間違っていますか?

4

3 に答える 3

12

ここに画像の説明を入力してください

CLOSはオブジェクトシステムであり、CLOSの概念自体がファーストクラスのオブジェクトです。クラス自体は、メタクラスのインスタンスです。いくつかの循環性が関係しています。

インスタンスがありますstandard-object。のインスタンスですstandard-class。それ自体がクラスです。すべての標準CLOSオブジェクトには、スーパークラスとして含まれます。構造など、他のタイプのオブジェクトがあります。したがってstandard-object、すべての一般的なCLOSオブジェクトのスーパークラスとして存在します。

standard-classそれ自体のインスタンスです。これは、すべてのクラスオブジェクトのクラスです。standard-objectもクラスであるため、クラスのstandard-objectインスタンスはクラスのインスタンスですstandard-class。すべての標準クラスもCLOSオブジェクトであるため、standard-classから継承しstandard-objectます。

CL-USER 22 > (class-of (find-class 'standard-object))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-objectクラスオブジェクトのクラスはですstandard-class

CL-USER 23 > (class-of (find-class 'standard-class))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-classクラスオブジェクトのクラスはですstandard-class

CL-USER 24 > (find-class 'standard-object)
#<STANDARD-CLASS STANDARD-OBJECT 40F017732B>

クラスstandard-objectはそれ自体がオブジェクトであり、クラスです。これは、すべてのCLOSオブジェクトのスーパークラスです。

CL-USER 25 > (find-class 'standard-class)
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

クラスstandard-classはそれ自体がオブジェクトであり、クラスです。これは、すべてのCLOSクラスのスーパークラスです。

于 2012-10-10T09:44:26.833 に答える
2

これを理解するには、の概念を理解する必要がありますmeta class。メタクラスのインスタンスはクラスであり、クラスのインスタンスはオブジェクトであるため、基本的に3つのレベルの階層があります。

standard-classメタクラスです。standard-objectはメタクラスのインスタンスであるstandard-classため、クラスです。他のすべてのユーザー定義クラスは、デフォルトでstandard-objectクラスから継承します。

したがって、クラスを作成するときは、基本的にstandard-classメタクラスをインスタンス化し、この新しいクラスはクラスに継承されstandard-objectます。

于 2012-10-10T09:14:19.647 に答える
1

私はあなたを混乱させているように思われる1つの質問だけに答えようとします:

標準オブジェクトを標準クラスのスーパークラスにすると同時に、そのインスタンスにする方法はありますか?

数学からの関係の概念に精通していることを願っています。操作を使用してセットで定義された関係。関係の例には、「で割り切れる」、「である」、「等しい」などが含まれます。したがって、「のインスタンスである」は関係であり、「のサブクラスである」も関係です。それらは決して同じではありません!サブクラスはクラスである必要があり、インスタンスはクラスである可能性がありますが、通常は別のものです。自然から例をとると、霊長目は哺乳類のサブクラスです-これは「のサブクラス」の関係です。名犬ラッシー(映画の犬)は哺乳類です。これは「インスタンス」関係の例です。

さて、おそらくあなたを混乱させたのは、何かの「インスタンス」である何かの機能は、その何かのクラスであるということです。これは実際にはあまり起こりませんが、私が考えることができることは次のとおりです。

言語と文法。文法は言語を定義する一連のルールであり、文法自体も言語です(つまり、「言語のサブクラス」です)。一方、言語は文法ルールをインスタンス化するため、言語は「インスタンス」の文法です。

于 2012-10-10T11:42:19.643 に答える