このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
“价值”クラスコンストラクターは,代入先の変数に関連付けられたオブジェクトを返します。この変数を代入し直すと,MATLAB®は元のオブジェクトの独立したコピーを作成します。この変数を変更するために関数に渡す場合,関数は変更されたオブジェクトを出力引数として返さなければなりません。値クラスの動作については,データの不要なコピーの回避を参照してください。
处理クラスコンストラクターは,作成されたオブジェクトへの参照であるハンドルオブジェクトを返します。MATLABにオリジナル オブジェクトのコピーを作成させないで、ハンドル オブジェクトを複数の変数に割り当てたり、あるいはそれを関数に渡したりすることができます。入力引数として渡されたハンドル オブジェクトを変更する関数は、そのオブジェクトを返す必要がありません。
すべてのハンドルクラスは抽象クラス处理
から派生します。
既定では,MATLABクラスは値クラスです。以下の定義はMyValueClass
という名前の値クラスを作成します。
classdefMyValueClass...
结束
处理
クラスを作成するには,处理
クラスからクラスを派生させます。
classdefMyHandleClass <处理...
结束
MATLABの基本クラスは値クラスです(数値,逻辑
、字符
、细胞
、结构体
,および関数ハンドル)。たとえば,int32
クラスのオブジェクトを作成し,このオブジェクトのコピーを作成すると,結果として2つの独立したオブジェクトになります。一个
の値を変更してもb
の値は変わりません。これは値を表すクラスの通常の動作です。
一个= int32 (7);b =一个;= ^ 4;
b 7
MATLABグラフィックスオブジェクトは視覚的要素を表すため,ハンドルオブジェクトとして実装されます。たとえば,グラフィックスの线オブジェクトを作成し,そのハンドルを他の変数にコピーします。両方の変数が同じ线オブジェクトを参照します。
x = 1:10;y = sin (x);l1 =线(x, y);l2 = l1;
ハンドルのコピーのいずれかを使用して,行オブジェクトのプロパティを設定します。
集(l2,“颜色”,“红色”)设置(l1,“颜色”,“绿色”)
get (l2,“颜色”)
Ans = 0 0
l2
ハンドルに対して関数删除
を呼び出すと线オブジェクトは破棄されます。行l1
に颜色
プロパティを設定しようとすると,関数集
はエラーを返します。
删除(l2)集(l1,“颜色”,“蓝”)
使用matlab.graphics.primitive错误。无效或已删除的对象。
既存ハンドルの削除によってこのオブジェクトを削除すると,すべてのコピーが無効になります。これは,すべてのハンドルが参照する唯一のオブジェクトを削除したためです。
ハンドルオブジェクトの削除はハンドル変数のクリアと同じではありません。グラフィックスオブジェクト階層では,オブジェクトの親がオブジェクトへの参照を保持します。たとえば,親座標軸は,l1
とl2
によって参照される线オブジェクトへの参照を保持します。ワークスペースから両方の変数をクリアしても,オブジェクトは存在したままです。
ハンドルオブジェクトの動作の詳細については,ハンドルオブジェクトの動作を参照してください。
MATLABは,値クラスのオブジェクトをオブジェクトの代入先の変数に関連付けます。値オブジェクトを別の変数にコピーするか,または値オブジェクトを関数に渡すと,MATLABはオブジェクトとオブジェクトに含まれるすべてのデータの独立したコピーを作成します。新しいオブジェクトは,元のオブジェクトに加えられた変更内容には影響されません。値オブジェクトはMATLABの数値クラスと结构体
クラスのように動作します。各プロパティは,本質的にMATLAB配列のように動作します。
値オブジェクトは,常に1つのワークスペースまたは一時変数に関連付けられています。値オブジェクトの変数がスコープ外になるかクリアされると,値オブジェクトはスコープ外になります。値オブジェクトへの参照は存在せず,独立したオブジェクトのコピーのみが存在します。
数量
プロパティに値を格納する値クラスを次に示します。既定のプロパティ値は数値1
です。
classdefNumValue属性数量= 1结束结束
変数一个
に代入するNumValue
オブジェクトを作成します。
一个= NumValue
a = NumValue属性:Number: 1
一个
の値を別の変数b
に代入します。
b =一个
b = NumValue属性:Number: 1
変数一个
と変数b
は独立しています。一个
の数量
プロパティの値を変更しても,b
の数量
プロパティには影響しません。
a.Number = 7
a = NumValue属性:Number: 7
b
b = NumValue属性:Number: 1
値オブジェクトを関数に渡すと,MATLABはそのオブジェクトのコピーを関数のワークスペース内に作成します。値オブジェクトのコピーは独立しているため,関数は呼び出し元のワークスペースにあるオブジェクトを変更しません。このため,値オブジェクトを変更する関数は,呼び出し元のワークスペースで代入し直すために,変更されたオブジェクトを返さなければなりません。
詳細については,オブジェクトの変更を参照してください。
处理
クラスから派生するクラスのインスタンスは,基となるオブジェクトデータの参照です。ハンドルオブジェクトがコピーされると,MATLABによってそのハンドルがコピーされますが,オブジェクトプロパティに保存されたデータはコピーされません。コピーは,元のハンドルと同じオブジェクトを参照します。元のオブジェクトのプロパティ値を変更すると,コピーされたハンドルは同じ変更内容を参照します。
数量
プロパティの値を格納するハンドルクラスを以下に示します。既定のプロパティ値は数値1
です。
classdefNumHandle <处理属性数量= 1结束结束
変数一个
に代入するNumHandle
オブジェクトを作成します。
一个= NumHandle
a = NumHandle的属性
一个
の値を別の変数b
に代入します。
b =一个
b = NumHandle属性:Number: 1
変数一个
および変数b
は,基となる同じオブジェクトを参照します。一个
の数量
プロパティの値を変更すると,b
の数量
プロパティも変わります。つまり,一个
とb
は同じオブジェクトを参照しています。
a.Number = 7
a = NumHandle属性:Number: 7
b
b = NumHandle带有属性:Number: 7
ハンドルオブジェクトを関数に渡すと,MATLABはそのハンドルのコピーを関数のワークスペース内に作成します。ハンドルのコピーが基となる同じオブジェクトを参照するため、ハンドル オブジェクトを変更する関数は呼び出し元のワークスペースにあるオブジェクトも事実上変更します。したがって、入力引数として渡されたハンドル オブジェクトを変更する関数は、変更されたオブジェクトを呼び出し元に返す必要はありません。
詳細については,オブジェクトの変更を参照してください。
ハンドルの删除
メソッドを明示的に呼び出して,ハンドルオブジェクトを破棄できます。ハンドルクラスオブジェクトのハンドルを削除すると、すべてのハンドルが無効になります。以下に例を示します。
一个= NumHandle;b =一个;删除(a) b.Number
无效或已删除的对象。
ハンドルオブジェクトで删除
を呼び出すと,そのオブジェクトのデストラクター関数が起動します。詳細は,ハンドルクラスのデストラクターを参照してください。
属性ブロック内の既定値へのプロパティの初期化,およびコンストラクター内からのプロパティの初期化の違いに関する詳細については,プロパティ値の初期化とハンドルオブジェクトの配列の初期化を参照してください。
値オブジェクトの等価性とは,オブジェクトが同じクラスのものであり,同じ状態をもつことを意味します。
ハンドルオブジェクトの等価性とは,ハンドル変数が同じオブジェクトを参照することを意味します。同じ状態をもつ同じクラスの異なるオブジェクトを参照するハンドル変数を識別することもできます。
値オブジェクトのサイズが同じで値が等しいかどうかを判定するには,isequal
を使用します。たとえば,前に定義したNumValue
クラスを使用して2つのインスタンスを作成して等価性をテストするには,次のようにします。
一个= NumValue;b = NumValue;isequal (a, b)
ans = 1
一个
とb
は独立しているので同じオブジェクトではありません。ただし,それぞれが同じ値を示します。
値オブジェクトによって示される値を変更すると,オブジェクトは等価ではなくなります。
一个= NumValue;b = NumValue;b.Number = 7;isequal (a, b)
ans = 0
値クラスには,==
演算を実装する既定の情商
メソッドはありません。
ハンドルオブジェクトは,处理
基底クラスから情商
メソッドを継承します。==
とisequal
を使用して,ハンドルオブジェクト間の異なる2つの関係を次のようにテストできます。
ハンドルが同じオブジェクトを参照する場合,==
とisequal
は真正的
を返す。
ハンドルが同じ値をもつ同じクラスのオブジェクトを参照するが,同じオブジェクトではない場合,isequal
のみが真正的
を返す。
前に定義したNumHandle
クラスを使用して,オブジェクトを作成してハンドルをコピーします。
一个= NumHandle;b =一个;
==
とisequal
を使用して等価性をテストします。
a = =
ans = 1
isequal (a, b)
ans = 1
既定値を使用してNumHandle
クラスの2つのインスタンスを作成します。
一个= NumHandle;b = NumHandle;
一个
とb
が同じオブジェクトを参照するかどうかを判定します。
a = =
ans = 0
一个
とb
が同じ値をもつかどうかを判定します。
isequal (a, b)
ans = 1
处理
クラスからの派生により,クラスは以下を行うことができます。
複数の有用なメソッドを継承する(ハンドルクラスのメソッド)
イベントとリスナーを定義する(イベントとリスナーの構文)
動的プロパティを定義する(動的プロパティ——インスタンスへのプロパティの追加)
设置メソッドと得到メソッドを実装する(プロパティの设置/获取インターフェイスの実装)
コピーの動作をカスタマイズする(ハンドルクラスのコピーの実装)
ハンドルクラスとそのメソッドの詳細は,ハンドルスーパークラスを参照してください。