MPS 2023.3 ヘルプ

型拡張メソッド

Jetbrains.mps.baseLanguage.extensionMethods 言語は、Java の静的メソッドに似た、新しく定義されたメソッドまたはオーバーライドされたメソッドを使用して有効な MPS 型を拡張する方法を提供します。

"This is an ordinary string with a surpricing behavior!".myNewMethod() "Develop with pleasure!".isAPleasureMessage() int num = ... num.isPrime()

静的メソッドは拡張クラスの内部部分になることはなく、拡張メソッドのパラメーターの 1 つとして操作する「拡張」オブジェクトを常に指定する必要がありますが、拡張メソッドでは、新しいメソッドがターゲット型で使用可能な操作のリストに直接追加されます。

古き良き「静的メソッド」の方法ではなく、文字列型にメソッドを追加したい場合は、次のようになります。

public static string reverse(string target) { //reverse the target }

New-> jmbaseLanguage.extensionMethods/type extension を使用して新しい拡張メソッドを作成し、新しいメソッドを定義して文字列クラスに関連付けます。

public extension methods MySampleMethods for string { <<static fields>> public string reverse() { //reverse the string, refering to it through 'this' } }

まったく同じメカニズムを使用して、既存のメソッドをオーバーライドできます。そして、元のメソッドを呼び出す必要がある場合は、これで呼び出すだけです:

 public extension methods MySampleMethods for string { <<static fields>> public string trim() { this.trim() + " trimmed" //calls the original trim() implementation } }

MPS は、拡張メソッドメカニズムを介して元のメソッドとオーバーライドされたメソッドを視覚的に区別するのに適しているため、ドロップダウンリストから正しいメソッドを選択するのを間違えることはありません。

extension-methods1.png

明らかに、このメカニズムを使用して、独自のドメインオブジェクトに直交概念を実装することもできます。

public extension methods Sample for my_type { <<static fields>> public int foo() { return this.bar(); } }

上記の宣言を使用すると、タイプ my_type で操作を記述できます。

my_type var = ...; var.foo();

ルートノード

メソッドを使用して型を拡張するには、同様に 2 つの優れた方法があります。タイプの拡張を使用すると、1 つの場所で単一の型にメソッドを追加できますが、Simple Extension Method Container は、複数の異なる型の直交概念を実装するために 1 つの場所が必要な場合に便利です。

タイプの拡張

このルートには単一型の拡張メソッドの宣言が含まれています。

[public|protected|private] extension methods containerName for extendedType { <<static fields>> <<extension methods>> }

拡張メソッド宣言

public ret_Type methodName() { <no statements> }

単純拡張メソッドコンテナー

[public|protected|private] extension methods containerName { <<static fields>> <<extension methods>> }

拡張メソッド宣言ターゲットタイプはメソッドごとに指定されます。

public ret_type methodName() for extendedType { <no statements> }

宣言部

許可された内容

containerName

任意の有効な識別子

extendedType

任意の有効な MPS タイプ

両方の根は 1 つ以上の静的フィールドを含むことができます。これらはコンテナー内のすべてのメソッドで利用可能です。