暗黙的なクラス変換
MATLAB® は、以下の場合にクラスを暗黙的に変換できます。
連結を使用したオブジェクト配列の作成または変更
添字添字を使った代入を使用したオブジェクト配列の作成または変更
プロパティの検証
関数およびメソッドの呼び出しでの引数の検証
変換を実行するため、MATLAB は変換のコンテキストに応じて、コンバーター メソッド、変換先のクラスのコンストラクター、または関数 cast
を使用しようとします。
連結
連結操作では、上位オブジェクトが結果の配列のクラスを決定します。MATLAB では、以下のルールに従って上位オブジェクトが決定されます。
ユーザー定義クラスは、
double
などの組み込みクラスより上位である。どの 2 つのクラス間にも上下関係が定義されていない場合は、連結ステートメントの最も左側にあるオブジェクトが最上位になる。クラスの上下関係の詳細については、メソッドの呼び出しを参照してください。
たとえば、A
は ClassA
のインスタンスで、B
は ClassB
のインスタンスです。ステートメント C = [A,B]
では、A
が上位オブジェクトの場合、MATLAB は B
をクラス A
に変換しようとします。
MATLAB は最初にコンバーター メソッドを呼び出そうとします。コンバーター メソッドが見つからない場合、ClassA
のコンストラクターを呼び出します。この連結ステートメントは以下と等価です。
C = [A,ClassA(B)]
ClassA
コンストラクターの呼び出しで B
を ClassA
に変換できない場合、MATLAB はエラーを発行します。変換が成功すると、MATLAB は A
を変換された B
と連結します。
添字を使った代入
添字による代入では、代入ステートメントの左辺が配列のクラスを定義します。右辺のクラスが左辺と異なるときに配列要素を代入する場合、MATLAB は右辺を左辺のクラスに変換しようとします。
たとえば、ClassB
のオブジェクトを配列 A
の要素に代入するには、変換が必要になります。
A = ClassA; B = ClassB; A(2) = B;
MATLAB は、最初にコンバーター メソッドを探して変換を実行しようとします。コンバーター メソッドが見つからない場合、ClassA
コンストラクターを呼び出します。この代入は以下と等価です。
A(2) = ClassA(B)
コンストラクターの呼び出しに失敗すると、MATLAB は cast
を呼び出します。
A(2) = cast(B,"like",A)
これらのステップを実行しても変換が失敗する場合、MATLAB はエラーを発行します。変換が成功すると、MATLAB は変換された値を A(2)
に代入します。
プロパティの検証
クラス制限を検証の一部として指定しているプロパティに値を代入すると、MATLAB は、組み込み関数 isa
を使用して、値とクラスの間の関係をチェックします。その値が、指定されたクラスまたはそのサブクラスのいずれの値でもない場合、MATLAB は値を、指定されたクラスに変換しようとします。
変換プロセスのデモとして、以下のクラス定義を参照してください。
classdef ClassA properties Prop ClassB end end
classdef ClassB end
classdef SubClassB < ClassB end
classdef ClassC end
以下のスクリプトは、MATLAB がプロパティへの代入中に変換を試みている状況を示しています。
A = ClassA; B = ClassB; SB = SubClassB; C = ClassC; A.Prop = B; % no conversion A.Prop = SB; % no conversion A.Prop = C; % conversion required
このスクリプトでは、次のようになります。
B
はClassA
で定義されたProp
のプロパティ検証を満たすClassB
に属しているため、A.Prop = B
は変換の必要がありません。SB
はClassB
のサブクラスであるSubClassB
に属しているため、A.Prop = SB
は変換の必要がありません。C
はClassB
またはそのサブクラスのSubClassB
に属していないため、A.Prop = C
は変換が必要です。MATLAB は、まず
ClassB(C)
を呼び出して、C
をClassB
またはそのサブクラスSubClassB
に変換しようとします。この呼び出しにより、ClassB
というコンバーター メソッド (ClassC
で定義) またはClassB
コンストラクターが呼び出されます。ClassB(C)
を呼び出してもClassB
またはSubClassB
のインスタンスが生成されなかった場合は、MATLAB は最終ステップとしてClassB(C)
の結果をClassB
にキャストしようとします。これらのステップで
C
をClassB
またはSubClassB
に変換できなかった場合、MATLAB はエラーを発行します。変換が成功すると、MATLAB は変換された値をA.Prop
に書き込みます。
メモ
プロパティのクラス検証では、独自の変換メソッドを用意したとしても、cell 配列への組み込み型の暗黙的な変換をサポートしていません。
関数およびメソッドの引数の検証
クラス制限を検証の一部として指定している関数またはメソッドの引数に値を代入すると、MATLAB は、組み込み関数 isa
を使用して、値とクラスの間の関係をチェックします。その値が、指定されたクラスまたはそのサブクラスのいずれの値でもない場合、MATLAB は値を、指定されたクラスに変換しようとします。
変換プロセスのデモとして、以下のクラスと関数の定義を参照してください。
classdef ClassA end
classdef SubClassA < ClassA end
classdef ClassB end
function test(x) arguments x ClassA end end
以下のスクリプトは、MATLAB が引数の検証中に変換を試みている状況を示しています。
A = ClassA; SA = SubClassA; B = ClassB; test(A); % no conversion test(SA); % no conversion test(B); % conversion required
このスクリプトでは、次のようになります。
A
はtest
で定義されたx
の引数の検証を満たすClassA
に属しているため、test(A)
は変換の必要がありません。SA
はClassA
のサブクラスであるSubClassA
に属しているため、test(SA)
は変換の必要がありません。B
はClassA
またはそのサブクラスのSubClassA
に属していないため、test(B)
は変換が必要です。MATLAB は、まず
ClassA(B)
を呼び出して、B
をClassA
またはそのサブクラスSubClassA
に変換しようとします。この呼び出しにより、ClassA
というコンバーター メソッド (ClassB
で定義) またはClassA
コンストラクターが呼び出されます。ClassA(B)
を呼び出してもClassA
またはSubClassA
のインスタンスが生成されなかった場合は、MATLAB は最終ステップとしてClassA(B)
の結果をClassA
にキャストしようとします。これらのステップで
B
をClassA
またはSubClassA
に変換できなかった場合、MATLAB はエラーを発行します。変換が成功すると、MATLAB は変換された値を関数呼び出しに使用します。
メモ
引数の検証では、独自の変換メソッドを用意したとしても、cell 配列への組み込み型の暗黙的な変換をサポートしていません。