静的型付けの言語を好むことは知っていますが、動的型付けの言語を検討する場合は、すべてがオブジェクトであり(クラスとメソッドもこのルールの例外ではありません)、すべてを操作できるため、Smalltalkが適している可能性があります(照会されただけでなく、変更されました)。あなたの要件に行きます:
クラス(またはインターフェース)Cが与えられると、プログラミング言語により、ユーザーはCを拡張/実装するすべてのクラスのリストにアクセスできます。
Smalltalkには、インターフェースの概念が組み込まれていません(ただし、サポートを追加した拡張機能を見たことがあると思います)。ただし、次のことができます。
- クラスが与えられたら、それを直接サブクラスとして見つけます:
Number subclasses
答え{Fraction. Float. Integer}
。
- またはその下のすべての階層:
Number allSubclasses
回答an OrderedCollection(Fraction Float Integer ScaledDecimal SmallInteger LargePositiveInteger LargeNegativeInteger)
pop
特定のセレクター(この場合)を実装するすべてのクラスを見つけることもできます。
SystemNavigation default allClassesImplementing: #pop
答え{ContextPart. FileSystemGuide. LIFOQueue. Stack}
ご覧のとおり、メソッドのセットを実装するクラスをクエリするための「インターフェイス」オブジェクトを定義するのは非常に簡単です(メソッド名のコレクションを用意し、それぞれを実装するクラスをクエリして、クラスをセットに追加するだけです)。ただし、インターフェイスを実装していることをクラスで明示的に指定する場合は、さらに作業を行う必要があります。
プログラミング言語を使用すると、ユーザーはクラスのすべての変数とメソッドを反復処理できます。
Point instVarNames
答え#('x' 'y')
Point allMethods
CompiledMethod
s(メソッドを表すオブジェクト)のコレクションに応答します
Point allSelectors
そのクラスのインスタンスが応答できるすべてのメソッド名のコレクションに応答します。
ユーザーは、関数が取る引数の数とタイプを決定できます。
この場合、コンパイルされたメソッドを操作し、必要な引数の数を尋ねます(パラメータータイプの概念はありません)。
(Point methodNamed: #x) numArgs
ただのゲッターなので、0と答えます。
(Point methodNamed: #+) numArgs
回答1
これは、Smalltalkの反射機能のほんの一部です。さらに深く知りたい場合は、次のリンクのいくつかをチェックしてください。
HTH