「同等の... オブジェクト指向のアプローチを使用する」という意味がわかりません。Pythonでは、関数は(あなたが言うように)ファーストクラスのオブジェクトであるため、関数を引数として渡すのが「オブジェクト指向」ではないのはなぜですか?
関数がファーストクラスオブジェクトではない言語でこれを達成する標準的な方法は?
関数がファーストクラスのオブジェクトにならない標準的な方法があるという範囲でのみ、私は言います。
C++ では、 functorまたはfunctionoidと呼ばれることが多い別のクラスを作成するのが一般的です。これは、 のオーバーロードを定義し、operator()
インスタンスを関数のように構文的に使用できるようにします。ただし、単純な古い関数ポインターでうまくいくこともよくあります。ポインターも指定された関数もファースト クラスのオブジェクトではありませんが、インターフェイスは十分に豊富です。
これは、テンプレートによって実現される「アドホック ポリモーフィズム」とうまく調和します。クラスのインスタンスを渡すか関数ポインタを渡すかを実際には気にしない関数を書くことができます。
同様に、Python では、クラスのメソッドをcallable
定義することにより、オブジェクトを登録することができます。__call__
smalltalk や Objective-C のようなブロックは、この点で関数としてカウントされますか?
私は彼らがそうすると言います。ラムダは少なくとも Python の関数と同じくらい数えられます。実際には、Python のラムダのように機能しなくなっていないため、ラムダはそれ以上に数えられます。
ブロックはこれらの言語でこれを行うための最良の方法でしょうか?
必要なものによって異なります。
実行時に新しいメソッドを追加できますか? どの言語でこれが可能 (かつ簡単) でしょうか?
独自のコンパイラへのイントロスペクションとランタイム アクセスを提供する言語。Python が該当します。
ただし、これまでに提示されたように、問題については何もなく、そのようなフープを飛び越える必要があることを示唆しています。もちろん、一部の言語では、新しいクラスに対して他の言語よりも多くのボイラープレートが必要です。
それとも、目的の操作を実行する単一のメソッドでオブジェクトを作成する方がよいでしょうか?
それはかなり標準的です。
たくさんの関数を渡したい場合、たくさんのシングルトン オブジェクトを作成しますか?
これは、大量のボイラープレートを作成してそれを防ごうとしないと、クラスの複数のインスタンスを誤って作成する可能性があるかのように言います。
これは、よりオブジェクト指向のアプローチと見なされますか?
繰り返しますが、「オブジェクト指向」という用語に対するあなたの理解を理解することはできません。「たくさんのオブジェクトを作成する」という意味ではありません。
関数がファーストクラスオブジェクトであるPythonでこれを行うことを検討する人はいますか?
クラスにはできること、関数にはできないことを追加する必要がないわけではありません。アヒルのタイピングで、一体なぜあなたは気にするのですか?