Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

メソッドの定義と呼び出し

この章では、Caché クラスのメソッドを作成する際の規則とオプションについて説明します。また、そのようなメソッドを呼び出す際の規則とオプションについても説明します。以下のトピックについて説明します。

インスタンス・メソッドの呼び出しの詳細は、次の章を参照してください。そのようなメソッドはオブジェクト・クラスにのみ適用されます。

このドキュメントをオンラインで表示している場合は、このドキュメントの "序文" を使用すると、他のトピックをすばやく見つけることができます。

メソッドの概要

メソッドとは、クラスによって定義される実行可能な要素です。Caché は、インスタンス・メソッドとクラス・メソッドの 2 種類のメソッドをサポートしています。インスタンス・メソッドは、クラスの特定のインスタンスから呼び出され、通常はそのインスタンスに関連するアクションを実行します。クラス・メソッドとは、オブジェクト・インスタンスへの参照なしに呼び出せるメソッドのことです。その他の言語では、静的メソッドと呼ばれています。

通常、メソッドは、インスタンス・メソッドを指します。それよりも具体的な表現のクラス・メソッドは、クラス・メソッドを表すために使用します。

インスタンス・メソッドは、オブジェクトのインスタンスが存在しないと実行できません。そのため、インスタンス・メソッドは、オブジェクト・クラスで定義されている場合にのみ役立ちます。これに対して、クラス・メソッドは、どの種類のクラスで定義してもかまいません。

メソッドの定義

クラスにクラス・メソッドを追加するには、クラス定義に以下に示すような要素を追加します。

ClassMethod MethodName(Arguments) as Classname [ Keywords]
{
//method implementation
}

以下はその説明です。

  • MethodName はメソッドの名前です。規則については、このドキュメントで前述の “名前付け規約” を参照してください。

  • Arguments は、引数のコンマ区切りリストです。詳細は、“メソッドの引数の指定” を参照してください。“ ”

  • Classname は、このメソッドで返される値 (ある場合) のタイプを表す、オプションのクラス名です。メソッドが値を返さない場合は、As Classname 部分を省略します。

    クラスは、データ型クラス、オブジェクト・クラス、またはタイプのないクラス (あまり一般的ではありません) になります。クラス名は完全なクラス名か、短いクラス名になります。詳細は、“パッケージのオプション” の章の “クラス参照時のパッケージの使用” を参照してください。

  • Keywords はメソッド・キーワードを表します。これはオプションです。このドキュメントで前述した、“コンパイラ・キーワード” を参照してください。この章の後続のセクションでは、追加のキーワードについて説明します。

  • メソッドの実装は、メソッドの実装言語とタイプによって異なります。“実装言語の指定” および “メソッドのタイプ” を参照してください。“ ” 既定では、メソッドの実装はゼロ行以上の ObjectScript で構成されます。

クラスにインスタンス・メソッドを追加するには、同じ構文で ClassMethod の代わりに Method を使用します。

Method MethodName(arguments) as Classname [ Keywords]
{
 //method implementation
}

インスタンス・メソッドは、オブジェクト・クラスでのみ存在価値があります。

メソッドの引数の指定: 基本

メソッドは、任意の数の引数を取ることができます。メソッドの定義では、メソッドが取る引数を指定する必要があります。また、各引数のタイプと既定値も指定できます。(この場合のタイプは、あらゆる種類のクラスを指します。特にデータ型クラスを指すわけではありません。)

以下の汎用クラスのメソッド定義について考えてみます。

ClassMethod MethodName(Arguments) as Classname [ Keywords]
{
 //method implementation
}

Arguments は、以下に示す一般的な形式になります。

argname1 as type1 = value1, argname2 as type2 = value2, argname3 as type3 = value3, [and so on]

以下はその説明です。

  • argname1argname2argname3 などは、引数の名前です。これらの名前は、変数名の規則に従う必要があります。

  • type1type2type3 などはクラス名です。メソッド定義のこの部分は、このメソッドを使用することになるプログラマに向けて、どのタイプの値を対応する引数に渡すかについて説明することを目的としています。通常は、各メソッド引数のタイプを明示的に指定することをお勧めします。

    一般に、このタイプはデータ型クラスかオブジェクト・クラスになります。

    クラス名は完全なクラス名か、短いクラス名になります。詳細は、“パッケージのオプション” の章の “クラス参照時のパッケージの使用” を参照してください。

    構文のこの部分は省略できます。その場合は、as 部分も省略します。

  • value1value2value3 などは、引数の既定値です。引数に値が指定されていない状態でメソッドが呼び出されると、引数はメソッドでこの値に自動的に設定されます。

    各値は、リテラル値 ("abc" や 42)、または中括弧で囲まれた ObjectScript 式のどちらかにできます。例えば、以下のようになります。

    ClassMethod Test(flag As %Integer = 0)
    {
     //method implementation
    }

    別の例を示します。

    ClassMethod Test(time As %Integer = {$horolog} )
    {
     //method implementation
    }

    構文のこの部分は省略できます。その場合は、等号 (=) も省略します。

例えば、3 つの引数を取る Calculate() メソッドを考えてみます。

ClassMethod Calculate(count As %Integer, name, state As %String = "CA")
{
 // ...
}

ここで、countstate はそれぞれ %IntegerOpens in a new tab%StringOpens in a new tab として宣言されます。引数のデータ型の既定は %StringOpens in a new tab なので、タイプが指定されていない場合は %StringOpens in a new tab になります。上記では、name がその例です。

引数の渡し方の指示

メソッド定義では、このメソッドを使用することになるプログラマに向けて、各引数の予期された渡し方についても指示します。引数は、値 (既定の方法) または参照によって渡すことができます。この章で後述する、“メソッドに引数を渡す方法” を参照してください。

特定の変数を参照で渡すことが適切な場合と、適切でない場合があります。詳細はメソッドの実装によって異なります。そのため、メソッドを定義するときには、メソッド・シグニチャを使用して、他のプログラマに各パラメータの用途について指示する必要があります。

引数を参照で渡す必要があることを指示するには、引数名の前方のメソッド・シグニチャに ByRef 修飾子を含めます。両方の引数に ByRef を使用する例を以下に示します。

/// Swap value of two integers
Method Swap(ByRef x As %Integer, ByRef y As %Integer)
{
    Set temp = x
    Set x = y
    Set y = temp
}

同様に、引数を参照で渡す必要があることに加えて、値を受け取らないことを指示するには、引数名の前方のメソッド・シグニチャに Output 修飾子を含めます。例えば、以下のようになります。

Method CreateObject(Output newobj As MyApp.MyClass) As %Status
{
    Set newobj = ##class(MyApp.MyClass).%New()
    Quit $$$OK
}

可変個数の引数の指定

可変個数の引数を受け入れるメソッドを定義できます。これを行うには、以下の例に示すように、最後の引数の名前の後ろに ... を含めます。この例では、この機能がどのように使用されるかも示しています。

ClassMethod MultiArg(Arg1... As %String)
{
 Write "Invocation has ",
     $GET(Arg1, 0),
     " element",
     $SELECT(($GET(Arg1, 0)=1):"", 1:"s"),
     !
 For i = 1 : 1 : $GET(Arg1, 0)
 {
     Write:($DATA(Arg1(i))>0) "Argument[", i , "]:", 
         ?15, $GET(Arg1(i), "<NULL>"), !
 }
 Quit
}

以下のターミナル・セッションで、このメソッドの動作を示します。

SAMPLES>do ##class(VarNumArg.Demo).MultiArg("scooby","shaggy","velma","daphne","fred")
Invocation has 5 elements
Argument[1]:   scooby
Argument[2]:   shaggy
Argument[3]:   velma
Argument[4]:   daphne
Argument[5]:   fred

この機能の詳細は、"Caché ObjectScript の使用法" の “ユーザ定義コード” の章にある “可変の引数” のセクションを参照してください。

値を返す方法

値を返すようにメソッドを定義するには、そのメソッド内で以下のいずれかを使用します (ObjectScript でメソッドを実装する場合)。

Return returnvalue

または

Quit returnvalue

returnvalue は、このメソッドが返す適切な値です。これは、宣言したメソッド返りタイプと一致する必要があります。返りタイプがデータ型クラスの場合、メソッドはリテラル値を返す必要があります。返りタイプがオブジェクト・クラスの場合、メソッドは、そのクラスのインスタンス (具体的には、OREF) を返す必要があります。詳細は、“登録オブジェクトを使用した作業” の章を参照してください。“ ”

例えば、以下のようになります。

ClassMethod Square(input As %Numeric) As %Numeric
{
    Set returnvalue = input * input
    Return person
}

もう 1 つ例を挙げると、このメソッドはオブジェクト・インスタンスを返します。

ClassMethod FindPerson(id As %String) As Person
{
    Set person = ##class(Person).%OpenId(id)
    Return person
}

値を返す構文は、メソッドの実装言語によって異なります。

実装言語の指定

メソッドを作成するときには、実装言語を選択できます。実際には、1 つのクラス内で、複数のメソッドを異なる言語で実装することもできます。すべてのメソッドは、実装言語とは関係なく相互運用します。

既定では、メソッドは、そのメソッドが属するクラスの Language キーワードで指定された言語を使用します。このキーワードについては、既定が cache (ObjectScript) になります。その他のオプションには、basic (Caché Basic)、java (Java)、javascript (JavaScript)、mvbasic (MVBasic)、および tsql (TSQL) があります。

これは、そのメソッドの Language キーワードを以下のように設定することで、特定のメソッドごとにオーバーライドできます。

Class MyApp.Test {

/// A Basic method
Method TestB() As %Integer [ Language = basic]
{
    'This is Basic
    Print "This is a test"
    Return 1
}

/// An ObjectScript method
Method TestC() As %Integer [ Language = cache]
{
    // This is ObjectScript
    Write "This is a test"
    Quit 1
}
}

メソッドのタイプ (CodeMode オプション)

Caché では、クラス・コンパイラによる処理が異なる 4 つのタイプのメソッドをサポートしています。

コード・メソッド

コード・メソッドは、その実装が単純なコード行であるメソッドです。これは最も一般的なメソッドのタイプで、既定です。

メソッド実装には、実装言語に応じた有効なコードを含めることができます。

Note:

Caché には、多用する簡単なタスクを実行する一連のシステム定義メソッドが用意されています。ユーザ定義メソッドでこれらのタスクのいずれかを実行するようにした場合、コンパイラではそのユーザ定義メソッドの実行可能コードが生成されません。その代わり、このようなユーザ定義メソッドは該当のシステム定義メソッドに関連付けられます。このユーザ定義メソッドを呼び出すと、関連付けられたシステム定義メソッドが呼び出されるので、パフォーマンスの向上が望めます。また、デバッガはそのようなシステム定義メソッドのステップ実行を行いません。

式メソッド

式メソッドは、ある特定の状況で、クラス・コンパイラによって、指定された式の直接インライン代替メソッドに置換される場合があるメソッドです。式メソッドは一般的に、高速な実行を必要とする (データ型クラス内の) 単純なメソッドに使用されます。

例えば、前の例の Dog クラスの Speak() メソッドを、式メソッドに変換することが可能です。

Method Speak() As %String [CodeMode = expression]
{
    "Woof, Woof"
}

dogDog オブジェクトを参照しているとすると、以下のようにこのメソッドを使用できます。

Write dog.Speak()

これは、以下のコードを生成する結果となります。

Write "Woof, Woof"

式メソッドのすべての仮変数に、既定値を与えることをお勧めします。これは、実行時に実際の変数が見つからないことで発生する、潜在的なインライン置換問題を防ぎます。

Note:

Caché は、式メソッド内のマクロや参照渡し引数を許可していません。

呼び出しメソッド

呼び出しメソッドは、既存の Caché ルーチンの周囲のメソッド・ラッパを作成する、特別なメカニズムです。これは一般的に、従来のコードをオブジェクト・ベースのアプリケーションに移行するときに便利です。

メソッドを呼び出しメソッドとして定義すると、メソッドが呼び出されるときは常に、指定されたルーチンが呼び出されます。呼び出しメソッドの構文は以下のとおりです。

Method Call() [ CodeMode = call ]
{
    Tag^Routine
}

“Tag^Routine” は、ルーチン内のタグ名を指定します。

メソッド・ジェネレータ

メソッド・ジェネレータは実際には、クラスのコンパイル中にクラス・コンパイラによって呼び出される小さなプログラムです。この出力は、メソッドの実際の実行時実装です。メソッド・ジェネレータは強力なクラス継承の方法を提供し、クラスやプロパティ継承の必要性に応じてカスタマイズされた、高性能で特別なコードを生成します。Caché ライブラリ内で、メソッド・ジェネレータは、データ型やストレージ・クラスによって広範囲に使用されます。

詳細は、“メソッド・ジェネレータとトリガ・ジェネレータの定義” を参照してください。“ ”

メソッドを SQL ストアド・プロシージャとして投影する方法

クラス・メソッド (インスタンス・メソッドを除く) は、SQL ストアド・プロシージャとしても使用できるように定義できます。そのためには、メソッド定義に SqlProc キーワードを含めます。

プロシージャの既定の名前は CLASSNAME_METHODNAME になります。別の名前を指定するには、SqlName キーワードを指定します。

詳細は、"Caché SQL の使用法" の “ストアド・プロシージャの定義” を参照してください。

クラス・メソッドの呼び出し

このセクションでは、ObjectScript のクラス・メソッドを呼び出す方法について説明します。このセクションは、あらゆる種類のクラスに適用されます。インスタンス・メソッドは、オブジェクト・クラスにのみ適用されるため、次の章で説明します。

  • 任意のクラスのクラス・メソッドを呼び出すには (そのメソッドがプライベートでない場合)、以下の式を使用します。

    ##class(Package.Class).Method(Args)
    

    Package.Class はクラスの名前、Method はメソッドの名前、Args はメソッドの引数です。

    ##class は、大文字と小文字を区別しません。

    この式は指定されたクラス・メソッドを呼び出し、その返り値を取得します (ある場合)。この式は、DO コマンドや SET コマンドなどと共に使用することも、別の式の一部として使用することもできます。以下に、いくつかのバリエーションを示します。

    do ##class(Package.Class).Method(Args)
     set myval= ##class(Package.Class).Method(Args)
     write ##class(Package.Class).Method(Args) 
     set newval=##class(Package.Class).Method(Args)_##class(Package2.Class2).Method2(Args)
    

    パッケージは省略できます。その場合は、使用に適したパッケージ名がクラス・コンパイラによって判断されます (この名前解決は、“パッケージ” の章で説明されています)。

  • (クラス・メソッド内で) 以下の式を使用して、そのクラスの別のクラス・メソッド (継承されたメソッドでもかまいません) を呼び出します。

    ..MethodName(args)
    

    この式は DO コマンドと共に使用できます。メソッドが値を返す場合は、SET を使用することも、別の式の一部として使用することもできます。以下に、いくつかのバリエーションを示します。

    do ..MethodName()
     set value=..MethodName(args)
    
    Note:

    この構文をクラス・メソッドで使用してプロパティやインスタンス・メソッドを参照することはできません。これらを参照するにはインスタンス・コンテキストが必要になります。

  • 実行時までメソッド名が決定されないクラス・メソッドを実行するには、以下のように $CLASSMETHOD 関数を使用します。

    $CLASSMETHOD(classname, methodname, Arg1, Arg2, Arg3, ... )
    

    classname は、クラスの完全修飾名に評価されます。methodname は、そのクラス内のクラス・メソッドの名前に評価されます。また、Arg1Arg2Arg3 などは、そのメソッドへの引数になります。例えば、以下のようになります。

    set cls="Sample.Person"
     set clsmeth="PrintPersons" 
     do $CLASSMETHOD(cls,clsmeth)
    

    この例では、Sample.PersonOpens in a new tab クラスから PrintPersons メソッドが実行されます。

    詳細は、"Caché ObjectScript リファレンス" の "$CLASSMETHOD" のページを参照してください。

指定されたメソッドが存在しない場合や、そのメソッドがインスタンス・メソッドの場合は、システムによって <METHOD DOES NOT EXIST> エラーが生成されます。指定されたメソッドがプライベートの場合は、システムによって <PRIVATE METHOD> エラーが生成されます。

メソッドに引数を渡す方法

メソッドに引数を渡す既定の方法は、値渡しです。この方法では、前述の例に示したように、変数、リテラル値、またはその他の式として、メソッド呼び出しに単に引数を含めます。

また、引数を参照で渡すことも可能です。

これは、以下のように動作します。システムには、各ローカル変数の値を格納するためのメモリ位置があります。変数の名前は、メモリ位置のアドレスとして機能します。メソッドにローカル変数を渡すときには、値で変数を渡します。つまり、システムによってその値のコピーが作成され、元の値が変更されることはありません。その代わりに、メモリ・アドレスを渡すことができます。この方法は、参照渡しと呼ばれています。これは、引数として多次元配列を渡す唯一の方法でもあります。

ObjectScript の場合、引数を参照で渡すには、その引数の前にピリオドを置きます。例えば、以下のようになります。

set MyArg(1)="value A"
 set MyArg(2)="value B"
 set status=##class(MyPackage.MyClass).MyMethod(.MyArg)

この例では、値 (多次元配列) を参照で渡すことで、その値をメソッドが受け取れるようにしています。その他の場合でも、引数を参照で渡すことが役立ちます。これは、メソッドの実行後に、その値を使用できるようになるためです。以下に例を示します。

set status=##class(MyPackage.MyClass).GetList(.list)
 //use the list variable in subsequent logic

その他の場合、変数に値を指定し、その値を変更する (その値を参照で返す) メソッドを呼び出して、変更された値を使用することもできます。

メソッドのキャスト

あるクラスのメソッドを、別のクラスのメソッドとしてキャストするには、以下のどちらかの構文を使用します (ObjectScript の場合)。

Do ##class(Package.Class1)Class2Instance.Method(Args)
Set localname = ##class(Package.Class1)Class2Instance.Method(Args)

クラス・メソッドとインスタンス・メソッドの両方ともキャストできます。

例えば、2 つのクラス MyClass.UpMyClass.Down が、両方とも Go() メソッドを持つとします。 MyClass.Up の場合は、このメソッドが以下のようになります。

Method Go()
{
    Write "Go up.",!
}

MyClass.Down の場合は、Go() メソッドが以下のようになります。

Method Go()
{
    Write "Go down.",!
}

ユーザは、MyClass.Up のインスタンスを生成することができ、これを使用して MyClass.Down.Go メソッドを呼び出します。

>Set LocalInstance = ##class(MyClass.Up).%New()
 
>Do ##class(MyClass.Down)LocalInstance.Go()
Go down.

以下のように、式の一部に ##class を使用することもできます。

Write ##class(Class).Method(args)*2

変数を、返り値と同じ値に設定する必要はありません。

より一般的な方法は、インスタンスには $METHOD 関数を使用し、クラス・メソッドには $CLASSMETHOD 関数を使用することです。これらについては、この章の前述のセクションで説明しています。

継承されたメソッドの上書き

クラスは、その 1 つまたは複数のスーパークラスからメソッド (クラスおよびインスタンス・メソッドの両方) を継承します。Final の指定があるメソッドを除くと、それらの定義は、このクラス内に定義を用意することでオーバーライドできます。その場合は、以下の規則に注意してください。

  • メソッドがスーパークラスのクラス・メソッドの場合、サブクラスでインスタンス・メソッドとしてオーバーライドできません (逆の場合も同じです)。

  • サブクラス・メソッドの返り値の型は、元の返り値の型または元の返り値の型のサブクラスのいずれかと同じでなければなりません。

  • サブクラスのメソッドは、スーパークラスのメソッドより多くの引数を持つことができます (さらに、“引数の数” のサブセクションも参照してください)。

  • サブクラス内のメソッドは、引数のための異なる既定値を指定できます。

  • サブクラス・メソッド内の引数の型は、元のメソッドの引数の型と一致していなければなりません。特に、指定するすべての引数は、元の型または元の型のサブクラスのいずれかと同じでなければなりません。

    引数に指定された型がない場合には、コンパイラは引数を %StringOpens in a new tab として扱うことに注意してください。したがって、スーパークラスのメソッドの引数に型がない場合、サブクラスのメソッドの対応する引数は、%StringOpens in a new tab になるか、%StringOpens in a new tab のサブクラスになるか、または型なしになる可能性があります。

  • サブクラスのメソッドは、スーパークラスのメソッドと同じ方法で引数値を受け取る必要があります。例えば、指定した引数がスーパークラス内で参照によって渡される場合、同じ引数をサブクラス内でも参照によって渡す必要があります。

    この点でメソッド・シグニチャに整合性がないと、他の開発者がメソッドの適切な使用方法を知ることは難しくなります。ただし、コンパイラはエラーを発行しないことに注意してください。

メソッドの実装が、スーパークラスで定義されているメソッドと同じ名前のメソッドを呼び出す必要がある場合、##super() 構文を使用できます。これについては、サブセクションで説明します。この説明は、ObjectScript で記述されたコードに適用されます。

##super()

メソッド内で以下の式を使用して、最も近接しているスーパークラスで定義されたメソッドと同じ名前のメソッドを呼び出します。

##super()

この式は DO コマンドと共に使用できます。メソッドが値を返す場合は、SET を使用することも、別の式の一部として使用することもできます。以下に、いくつかのバリエーションを示します。

do ##super()
 set returnvalue=##super()_"additional string"
Note:

##super は、大文字と小文字を区別しません。また、この章で説明するその他の機能とは異なり、##super() は ObjectScript メソッド内で使用できるだけでなく、Basic メソッド内でも使用できます

これは、スーパークラスの既存のメソッドを呼び出して、いくつかの追加手順を実行 (そのメソッドから返された値の変更など) する必要のあるメソッドを定義する場合に役立ちます。

##super と メソッドの引数

##super は、引数を許可するメソッドでも機能します。サブクラス・メソッドで引数の既定値を指定していない場合、スーパークラスへの参照で引数をメソッドが渡していることを確認してください。

例えば、スーパークラス (MyClass.Up.SelfAdd()) のメソッドのコードが以下のとおりだとします。

ClassMethod SelfAdd(Arg As %Integer)
{
    Write Arg,!
    Write Arg + Arg
}

出力は、以下のようになります。

>Do ##Class(MyClass.Up).SelfAdd(2)
2
4
>

サブクラス (MyClass.Down.SelfAdd()) のメソッドでは、##super を使用し、引数を参照で渡します。

ClassMethod SelfAdd(Arg1 As %Integer)
{
    Do ##super(.Arg1)
    Write !
    Write Arg1 + Arg1 + Arg1
}

出力は、以下のようになります。

>Do ##Class(MyClass.Down).SelfAdd(2)
2
4
6
>

MyClass.Down.SelfAdd() では、引数名の前にあるピリオドに注目してください。これを省略して、引数を指定せずにメソッドを呼び出すと、<UNDEFINED> エラーを受け取ることになります。

##super が作用する呼び出し

##super は、現在のメソッド呼び出しにのみ作用します。そのメソッドで他の呼び出しを実行する場合、それらの呼び出しは、スーパークラスに対してではなく、現在のオブジェクトまたはクラスに対して実行されます。例えば、以下のように、MyClass.UpMyName() メソッドと CallMyName() メソッドがあるとします。

Class MyClass.Up Extends %Persistent
{

ClassMethod CallMyName()
{
    Do ..MyName()
}

ClassMethod MyName()
{
    Write "Called from MyClass.Up",!
}

}

また、以下のように、MyClass.Down で上記のメソッドをオーバーライドするとします。

Class MyClass.Down Extends MyClass.Up
{

ClassMethod CallMyName()
{
    Do ##super()
}

ClassMethod MyName()
{
    Write "Called from MyClass.Down",!
}

}

ここで、CallMyName() メソッドを呼び出すと、以下のような結果が返されます。

USER>d ##class(MyClass.Up).CallMyName()
Called from MyClass.Up
 
USER>d ##class(MyClass.Down).CallMyName()
Called from MyClass.Down

MyClass.Down.CallMyName() の出力は、MyClass.Up.CallMyName() とは異なっています。これは、MyClass.Down.CallMyName()CallMyName() メソッドには ##super が含まれており、MyClass.Up.CallMyName() メソッドを呼び出した後、キャストされない MyClass.Down.MyName() メソッドを呼び出しているからです。

引数の数

場合によっては、新しい引数をスーパークラス内のメソッドに追加して、サブクラス内のメソッドで定義されているよりも引数の数を多くすることが必要な場合もあります。コンパイラが (便宜上の理由で) サブクラス内のメソッドに引数を追加するために、サブクラスは引き続きコンパイルします。 たいていの場合、メソッドを拡張するすべてのサブクラスを調べ、追加の引数を構成するシグニチャを編集し、コードを編集するかどうかを決定することも引き続き必要です。シグニチャまたはコードを編集しない場合でも、次の 2 つの点を考慮する必要があります。

  • 追加の引数名が、サブクラス内のメソッドで使用されているどの変数の名前とも同じでないことを確認します。コンパイラは追加された引数をサブクラス内のメソッドに追加します。これらの引数が、サブクラスのメソッドで使用されている変数と同じ名前を持っていると、予期しない結果が生じることがあります。

  • サブクラス内のメソッドが (そのメソッドが ##super を使用しているために) 追加の引数を使用する場合は、スーパークラス内のメソッドが追加の引数に対して既定値を指定していることを確認します。

FeedbackOpens in a new tab