暗黙的なクラス変換
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 配列への組み込み型の暗黙的な変換をサポートしていません。