他のクラスから継承しないクラスを作成するにはどうすればよいですか?

エリザベス・マティセン

クラスを作成する場合:

class Foo { }

クラスはAnyからすべてのメソッドを継承し、次にMu

他のクラスから継承しないクラスを作成したいと思います。そのクラスには、そのオブジェクトのインスタンスへのすべてのメソッド呼び出しをFALLBACKキャッチする単一のメソッドが含まれている必要があります。

MetaModelコードを調べましたが、この目標を達成する簡単な方法はないようです。すべての提案は大歓迎です!

更新Jonathan Worthingtonが説明したように、メソッド呼び出しの方法でインターセプトを行うことにしましたこれにより、CPANに2つの新しいPerl6モジュールInterceptAllMethodsObject :: Trampolineが作成されました

ジョナサンワージントン

これは可能ですが、さらに努力が必要な実際的な問題に遭遇する可能性があります。構築ロジックの呼び出しは、コメントですでに指摘されている良い例です。さらに、すべてがMu;に対して正常にタイプチェックすることが期待されます。このようなチェックは、最適化としてほとんどの場所で省略されますが、他の場所では省略されないため、さまざまなタイプのチェックの失敗が発生することが予想されます。

それはさておき、これがそれを行う方法です。まず、の新しいメタタイプをエクスポートするモジュールを作成しますclass

class RootHOW is Metamodel::ClassHOW {
    method has_default_parent_type(|) { False }
}
package EXPORTHOW {
    constant class = RootHOW;
}

Muそもそもメタモデルを使用してを設定する必要があるため、ここでは(ab)通常、「いいえ、オブジェクトモデルをブートストラップしなかったため、デフォルトの親型はまだありません」というメカニズムを使用します。 "。これをモジュール(たとえば、と呼ばれるParentlessに貼り付けると、次のように実行できます。

use Parentless;
class NotAMu {
    method FALLBACK($name, |c) {
        say "called $name with {c.perl}"
    }
}
NotAMu.new

どの出力:

called new with \()

単にすべてのメソッドディスパッチをインターセプトすることが目標である場合、型システムを混乱させない、はるかに混乱の少ない方法があります。今のところ、メソッドキャッシュの公開を無効にするカスタムメタクラスが必要です。

class InterceptHOW is Metamodel::ClassHOW {
    method publish_method_cache(|) { }
}
package EXPORTHOW {
    constant class = InterceptHOW;
}

次に、次のように書くことができます。

use InterceptAllTheMethods;
class InterceptThemAll {
    method ^find_method(Mu $obj, Str $name) {
        return -> | { say "calling $name" }
    }
}
InterceptThemAll.new

とは異なりFALLBACK、ここでは、呼び出されるコードオブジェクトを返すことに注意してくださいこのfind_method実装はメタクラスでも記述できますが、これはより適切な因数分解になる可能性があります。手元の問題を知らずに言うのは難しいです。

このアプローチでは、タイプチェックに関連する問題は発生せず、すべてのメソッドディスパッチをインターセプトできます。また、のようなものを検索しblessて、それらをMu実装に委任するのは簡単です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

AからBを継承しながら、BからクラスAを継承するにはどうすればよいですか?

分類Dev

継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

分類Dev

継承可能なクラス変数を作成するにはどうすればよいですか?

分類Dev

特定の定義なしでランダム分布を作成するにはどうすればよいですか?Uniform_int_distributionは他のクラスから継承していますか?

分類Dev

2つのクラスからUITextFieldを継承するにはどうすればよいですか?

分類Dev

LuaBridgeを使用して同じクラスから継承された2つのクラスを登録するにはどうすればよいですか?

分類Dev

tf.Tensorから継承する新しいクラスを作成するにはどうすればよいですか?

分類Dev

super()を使用して、複数の父親クラスから特定のクラスを継承するにはどうすればよいですか?

分類Dev

Delphiで、IComparableを実装し、TEqualityComparerから継承するクラスを作成するにはどうすればよいですか?

分類Dev

クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

分類Dev

Odooの純粋なPythonクラスから継承してメソッドを変更するにはどうすればよいですか?

分類Dev

S4 クラスを別の S4 クラスから正しく継承するにはどうすればよいですか?

分類Dev

親クラスのすべての機能を継承するにはどうすればよいですか?

分類Dev

すべての変数を親クラスからinit関数を持つ基本クラスに継承するにはどうすればよいですか?

分類Dev

MatlabでTCPIPクラスを正しく継承するにはどうすればよいですか?

分類Dev

特定の変数をあるクラスから別のクラスに継承するにはどうすればよいですか?

分類Dev

カスタムLinkedListクラスから継承するにはどうすればよいですか?

分類Dev

継承で特定の基本クラスを取得するにはどうすればよいですか?

分類Dev

VueJSの小道具-「クラス」属性の継承を回避するにはどうすればよいですか?

分類Dev

プライベートコンストラクターを持つクラスがこのクラスからの継承を妨げないのはなぜですか?特定のベースから継承できるクラスを制御するにはどうすればよいですか?

分類Dev

次のクラス継承を設計するにはどうすればよいですか?

分類Dev

基本クラスから継承されていない列を一覧表示するにはどうすればよいですか?

分類Dev

クラス「a」が別のクラスに継承されないようにするにはどうすればよいですか?

分類Dev

継承を無視して、クラスが特定のタイプであるかどうかを確認するにはどうすればよいですか?

分類Dev

別のクラスから継承するPythonクラスの初期定義に追加するにはどうすればよいですか?

分類Dev

Java:部外者が継承するのを防ぎながら、パッケージ内でサブクラス化できるパブリッククラスを作成するにはどうすればよいですか?

分類Dev

関数を別のクラスからkotlinのアクティビティに継承するにはどうすればよいですか?

分類Dev

Ellipseクラスを継承するサブクラスを作成するにはどうすればよいですか?

分類Dev

継承されたクラスが基本クラスのコンストラクターパラメーターを渡さなければならないことを回避するにはどうすればよいですか?

Related 関連記事

  1. 1

    AからBを継承しながら、BからクラスAを継承するにはどうすればよいですか?

  2. 2

    継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

  3. 3

    継承可能なクラス変数を作成するにはどうすればよいですか?

  4. 4

    特定の定義なしでランダム分布を作成するにはどうすればよいですか?Uniform_int_distributionは他のクラスから継承していますか?

  5. 5

    2つのクラスからUITextFieldを継承するにはどうすればよいですか?

  6. 6

    LuaBridgeを使用して同じクラスから継承された2つのクラスを登録するにはどうすればよいですか?

  7. 7

    tf.Tensorから継承する新しいクラスを作成するにはどうすればよいですか?

  8. 8

    super()を使用して、複数の父親クラスから特定のクラスを継承するにはどうすればよいですか?

  9. 9

    Delphiで、IComparableを実装し、TEqualityComparerから継承するクラスを作成するにはどうすればよいですか?

  10. 10

    クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

  11. 11

    Odooの純粋なPythonクラスから継承してメソッドを変更するにはどうすればよいですか?

  12. 12

    S4 クラスを別の S4 クラスから正しく継承するにはどうすればよいですか?

  13. 13

    親クラスのすべての機能を継承するにはどうすればよいですか?

  14. 14

    すべての変数を親クラスからinit関数を持つ基本クラスに継承するにはどうすればよいですか?

  15. 15

    MatlabでTCPIPクラスを正しく継承するにはどうすればよいですか?

  16. 16

    特定の変数をあるクラスから別のクラスに継承するにはどうすればよいですか?

  17. 17

    カスタムLinkedListクラスから継承するにはどうすればよいですか?

  18. 18

    継承で特定の基本クラスを取得するにはどうすればよいですか?

  19. 19

    VueJSの小道具-「クラス」属性の継承を回避するにはどうすればよいですか?

  20. 20

    プライベートコンストラクターを持つクラスがこのクラスからの継承を妨げないのはなぜですか?特定のベースから継承できるクラスを制御するにはどうすればよいですか?

  21. 21

    次のクラス継承を設計するにはどうすればよいですか?

  22. 22

    基本クラスから継承されていない列を一覧表示するにはどうすればよいですか?

  23. 23

    クラス「a」が別のクラスに継承されないようにするにはどうすればよいですか?

  24. 24

    継承を無視して、クラスが特定のタイプであるかどうかを確認するにはどうすればよいですか?

  25. 25

    別のクラスから継承するPythonクラスの初期定義に追加するにはどうすればよいですか?

  26. 26

    Java:部外者が継承するのを防ぎながら、パッケージ内でサブクラス化できるパブリッククラスを作成するにはどうすればよいですか?

  27. 27

    関数を別のクラスからkotlinのアクティビティに継承するにはどうすればよいですか?

  28. 28

    Ellipseクラスを継承するサブクラスを作成するにはどうすればよいですか?

  29. 29

    継承されたクラスが基本クラスのコンストラクターパラメーターを渡さなければならないことを回避するにはどうすればよいですか?

ホットタグ

アーカイブ