Main Content

暗黙的なクラス変換

MATLAB® は、以下の場合にクラスを暗黙的に変換できます。

  • 連結を使用したオブジェクト配列の作成または変更

  • 添字添字を使った代入を使用したオブジェクト配列の作成または変更

  • プロパティの検証

  • 関数およびメソッドの呼び出しでの引数の検証

変換を実行するため、MATLAB は変換のコンテキストに応じて、コンバーター メソッド、変換先のクラスのコンストラクター、または関数 cast を使用しようとします。

連結

連結操作では、上位オブジェクトが結果の配列のクラスを決定します。MATLAB では、以下のルールに従って上位オブジェクトが決定されます。

  • ユーザー定義クラスは、double などの組み込みクラスより上位である。

  • どの 2 つのクラス間にも上下関係が定義されていない場合は、連結ステートメントの最も左側にあるオブジェクトが最上位になる。クラスの上下関係の詳細については、メソッドの呼び出しを参照してください。

たとえば、AClassA のインスタンスで、BClassB のインスタンスです。ステートメント C = [A,B] では、A が上位オブジェクトの場合、MATLAB は B をクラス A に変換しようとします。

MATLAB は最初にコンバーター メソッドを呼び出そうとします。コンバーター メソッドが見つからない場合、ClassA のコンストラクターを呼び出します。この連結ステートメントは以下と等価です。

C = [A,ClassA(B)]

ClassA コンストラクターの呼び出しで BClassA に変換できない場合、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 

このスクリプトでは、次のようになります。

  • BClassA で定義された Prop のプロパティ検証を満たす ClassB に属しているため、A.Prop = B は変換の必要がありません。

  • SBClassB のサブクラスである SubClassB に属しているため、A.Prop = SB は変換の必要がありません。

  • CClassB またはそのサブクラスの SubClassB に属していないため、A.Prop = C は変換が必要です。

    MATLAB は、まず ClassB(C) を呼び出して、CClassB またはそのサブクラス SubClassB に変換しようとします。この呼び出しにより、ClassB というコンバーター メソッド (ClassC で定義) または ClassB コンストラクターが呼び出されます。ClassB(C) を呼び出しても ClassB または SubClassB のインスタンスが生成されなかった場合は、MATLAB は最終ステップとして ClassB(C) の結果を ClassB にキャストしようとします。

    これらのステップで CClassB または 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 

このスクリプトでは、次のようになります。

  • Atest で定義された x の引数の検証を満たす ClassA に属しているため、test(A) は変換の必要がありません。

  • SAClassA のサブクラスである SubClassA に属しているため、test(SA) は変換の必要がありません。

  • BClassA またはそのサブクラスの SubClassA に属していないため、test(B) は変換が必要です。

    MATLAB は、まず ClassA(B) を呼び出して、BClassA またはそのサブクラス SubClassA に変換しようとします。この呼び出しにより、ClassA というコンバーター メソッド (ClassB で定義) または ClassA コンストラクターが呼び出されます。ClassA(B) を呼び出しても ClassA または SubClassA のインスタンスが生成されなかった場合は、MATLAB は最終ステップとして ClassA(B) の結果を ClassA にキャストしようとします。

    これらのステップで BClassA または SubClassA に変換できなかった場合、MATLAB はエラーを発行します。変換が成功すると、MATLAB は変換された値を関数呼び出しに使用します。

メモ

引数の検証では、独自の変換メソッドを用意したとしても、cell 配列への組み込み型の暗黙的な変換をサポートしていません。

関連するトピック