主要内容

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

ハンドルクラスと値クラスの比較

基本的な違い

“价值”クラスコンストラクターは,代入先の変数に関連付けられたオブジェクトを返します。この変数を代入し直すと,MATLAB®は元のオブジェクトの独立したコピーを作成します。この変数を変更するために関数に渡す場合,関数は変更されたオブジェクトを出力引数として返さなければなりません。値クラスの動作については,データの不要なコピーの回避を参照してください。

处理クラスコンストラクターは,作成されたオブジェクトへの参照であるハンドルオブジェクトを返します。MATLABにオリジナル オブジェクトのコピーを作成させないで、ハンドル オブジェクトを複数の変数に割り当てたり、あるいはそれを関数に渡したりすることができます。入力引数として渡されたハンドル オブジェクトを変更する関数は、そのオブジェクトを返す必要がありません。

すべてのハンドルクラスは抽象クラス处理から派生します。

値クラスの作成

既定では,MATLABクラスは値クラスです。以下の定義はMyValueClassという名前の値クラスを作成します。

classdefMyValueClass...结束

ハンドルクラスの作成

处理クラスを作成するには,处理クラスからクラスを派生させます。

classdefMyHandleClass <处理...结束

MATLAB組み込みクラスの動作

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错误。无效或已删除的对象。

既存ハンドルの削除によってこのオブジェクトを削除すると,すべてのコピーが無効になります。これは,すべてのハンドルが参照する唯一のオブジェクトを削除したためです。

ハンドルオブジェクトの削除はハンドル変数のクリアと同じではありません。グラフィックスオブジェクト階層では,オブジェクトの親がオブジェクトへの参照を保持します。たとえば,親座標軸は,l1l2によって参照される线オブジェクトへの参照を保持します。ワークスペースから両方の変数をクリアしても,オブジェクトは存在したままです。

ハンドルオブジェクトの動作の詳細については,ハンドルオブジェクトの動作を参照してください。

ユーザー定義の値クラス

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

ハンドルクラスによってサポートされる機能

处理クラスからの派生により,クラスは以下を行うことができます。

ハンドルクラスとそのメソッドの詳細は,ハンドルスーパークラスを参照してください。

関連するトピック