主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

条件付きステートメント内のオブジェクト

条件付きステートメントでのオブジェクトの使用を有効にする

オブジェクトのクラスの関係演算子を定義して,条件付きステートメントでのオブジェクトの使用を有効にします。处理クラスから派生するクラスは関係演算子を継承します。値クラスは,オブジェクトを含む条件付きステートメントの使用をサポートする演算子を実装できます。クラスの演算子を定義する方法の詳細については,演算子のオーバーロードを参照してください。

MATLABによる开关ステートメントの評価方法

MATLAB®では,オブジェクトのクラスで情商メソッドが定義されている場合に,开关ステートメントでオブジェクトを使用できます。情商メソッドでは,そのクラスのオブジェクトで==演算を実装します。

オブジェクトに対し,case_expression==switch_expressionはMATLABによる开关/情况下ステートメントの評価の方法を定義します。

情商メソッドによって返される値は逻辑型であるか,または逻辑型に変換可能でなければなりません。情商メソッドの出力が逻辑以外の値の場合,MATLABは情商の出力を逻辑値に変換しようとします。

メモ

列挙クラスに情商メソッドを定義する必要はありません。开关ステートメント内の列挙型を参照してください。

开关ステートメント内でのハンドルオブジェクト

处理クラスから派生したすべてのクラスは情商メソッドを継承します。たとえば,次の式について考えてみます。

h1 h2 = =

h1h2が同じオブジェクトに対するハンドルの場合,この式は真正的になります。

たとえば,BasicHandleクラスは处理から派生します。

classdefBasicHandle <处理属性Prop1结束方法函数obj = BasicHandle (val)如果Nargin > 0 obj。Prop1 = val;结束结束结束结束

BasicHandleオブジェクトを作成し,开关ステートメント内で使用します。

h1 = BasicHandle (处理对象的);h2 = h1;

开关ステートメントコードは以下のようになります。

开关h1情况下h2 disp (h2被选中的否则disp (“h2不选择”结束

結果は次のようになります。

h2被选中

オブジェクトはスカラー

开关ステートメントで使用できるオブジェクトはスカラーオブジェクトのみです。例:

h1 (1) = BasicHandle (处理对象的);h1 (2) = BasicHandle (处理对象的);h1 (3) = BasicHandle (处理对象的);h2 = h1;
开关h1情况下h2 disp (h2被选中的否则disp (“h2不选择”结束

結果は次のようになります。

SWITCH表达式必须是标量或字符串常量。

この例では,h1はスカラーではありません。开关ステートメントを開始する前に,isscalarを使用すると,オブジェクトがスカラーであるかどうかを調べることができます。

情商メソッドの定義方法

开关ステートメント内で値クラスオブジェクトを使用できるようにするには,クラスに情商メソッドを実装します。情商メソッドを使用して,2つのクラスオブジェクトが等価となるための条件を指定します。

組み込みタイプのような動作

一部のMATLAB関数は,関数の実装内で組み込みの==演算子も使用します。そのため,クラスオブジェクトがMATLABコード内で組み込みタイプと同じように機能するように,情商は組み込みの情商と置き換えられるように実装します。

情商の設計

情商メソッドを実装して==比較の結果を表す逻辑配列を返すようにします。

たとえば,SwitchOnVerクラスで情商メソッドを実装すると,2つのオブジェクトで版本プロパティの値が同じである場合に,==演算に対して真正的を返します。また,情商は組み込みの情商と同じように配列に対しても使用できます。以下の式について考えます。

其中obj1 = = methoda

情商メソッドは次のように機能します。

  • 其中obj1methodaの両方がスカラーの場合は,情商でスカラー値が返されます。

  • 其中obj1methodaの両方が非スカラー配列の場合,これらの配列は同じ次元をもつ必要があり,情商では同じサイズの配列が返されます。

  • 1つの入力引数がスカラーでもう1つの入力引数が非スカラー配列の場合,情商では,スカラーオブジェクトが非スカラー配列と同じ次元をもつ配列であるかのように扱われます。

情商の実装

次に,情商メソッドを実装するクラスを示します。目的の用途に対して適切なエラーチェックを確実に行うように実装してください。

classdefSwitchOnVer属性版本结束方法函数obj = SwitchOnVer(版本)如果Nargin > 0 obj。版本=版本;结束结束函数表示“eq(其中obj1 methoda)如果~ strcmp(类(其中obj1)类(methoda))错误('对象不属于同一类'结束s1 =元素个数(其中obj1);s2 =元素个数(methoda);如果S1 == s2 bol = false(size(obj1));k = 1: s1如果其中obj1 (k)。版本==methoda(k).Version bol(k) = true;其他的波尔(k) = false;结束结束elseifs1 == 1 bol = scalarExpEq(obj2,obj1);elseifs2 == 1 bol = scalarExpEq(obj1,obj2);其他的错误(“维missmatch”结束函数ret = scalarExpEq (ns, s)% ns是非标量数组% s是标量数组ret = false(大小(ns));n =元素个数(ns);kk = 1: n如果ns(乐)。Version == s.Version ret(kk) = true;其他的ret (kk) = false;结束结束结束结束结束结束

开关ステートメント内でSwitchOnVerオブジェクトを使用します。

创建已知版本的对象ov1 = SwitchOnVer (1.0);ov2 = SwitchOnVer (2.0);ov3 = SwitchOnVer (3.0);……如果isscalar (objIn)开关(objIn)情况下ov1 disp (“这是1.0版”情况下ov2 disp (“这是2.0版”情况下ov3 disp (“这是3.0版”否则disp (“没有版本”结束其他的错误('输入对象必须是标量'结束

开关ステートメント内の列挙型

MATLABでは,列挙クラスに対し明示的に定義された情商メソッドを要求せずに,开关ステートメントで列挙を使用できます。

たとえば,WeeklyPlannerクラスは週の5日の列挙型を定義します。静的メソッドtodaySchedule开关/情况下ステートメントは,現在の曜日に対応する列挙メンバーにディスパッチします。関数日期datestrは,現在の曜日の名前をもつ字符ベクトルを返します。

classdefWeeklyPlanner枚举星期一,星期二,星期三,星期四,星期五结束方法(静态)函数dayschedule dayName = datestr(日期,“dddd”);dayEnum = WeeklyPlanner。(dayName);开关dayEnum情况下WeeklyPlanner。星期一disp (周一安排的情况下WeeklyPlanner。周二disp (“星期二安排”情况下WeeklyPlanner。周三disp (“周三安排”情况下WeeklyPlanner。周四disp (“周四计划”情况下WeeklyPlanner。周五disp (周五安排的结束结束结束结束

todayScheduleを呼び出し,今日のスケジュールを表示します。

WeeklyPlanner.todaySchedule

組み込み型から派生した列挙型

組み込み型から派生した列挙クラスは,スーパークラスの情商メソッドを継承します。たとえば,流量クラスはint32から派生します。

classdef流量< int32枚举低(10)中(50)高(100)结束结束

関数switchEnumは入力引数をオンにします。入力引数は流量の列挙値をとります。

函数switchEnum (inpt)开关inpt情况下10 disp ('流量= 10 cfm'情况下50 disp ('流量= 50 cfm'情况下100 disp ('流量= 100 cfm'结束结束

列挙値を使用してswitchEnumを呼び出します。

switchEnum (FlowRate.Medium)
流量= 50立方英尺