主要内容

。

配列作成関数に対するクラスサポート

ユーザークラス向けの配列作成关数の拡张

那些Zeros.など,特定のサイズや型の配列を作成するMATLAB®关数がいくつかあります。ユーザー定义クラスには,オーバーロードメソッドの构文を使用する必要なしに,配列作成关数のサポートを追加できます。

任意の配列作成关数にクラスがサポートされるため,组み込みデータ型およびユーザー定义のデータ型と共有できるコードを开発できるようになります。たとえば,最初の开発期间中に,次のコード変数Xのクラスを组み込み型に设定し,その后Zeros.を透过的にオーバーロードするユーザー定义クラスで置き换えることもできます。

CLS =类(x)的;z阵列=零(M,N,CLS);

配列作成関数は,次の2つの方法で特定の型の配列を作成します。

  • クラス名の構文——配列要素の型を特定するクラス名を指定します。

  • プロトタイプオブジェクトの构文 - 配列の要素型と他の特性を决定するために关数が使用するプロトタイプオブジェクトを指定します。

以下に例を示します。

z阵列=零(2,3,'uint8');
P = UINT8([1 3 5 2 4 6]);z阵列=零(2,3,'喜欢', p);

これらの关数に対するサポートを我的课という名前のクラスに追加した后,そのクラスに同様の构文が使用できるようになります。

z阵列=零(2,3,“MyClass”);

または,ユーザークラスのオブジェクトを渡します。

p = MyClass(…);zArray = 0(大小(p),'喜欢', p);

MATLABはこれらの引数を使用してユーザークラスの適切なメソッドにディスパッチします。

オーバーロードをサポートする配列作成关数

以下の関数は,この種類のオーバーロードをサポートします。

配列作成关数
那些
Zeros.
眼睛
(小文字)
真正的
错误的
投掷
兰特
兰德
兰迪

使用する構文

既定のオブジェクトの配列を作成する场合は,コンストラクターに入力引数を指定する必要がないため,クラス名の构文を使用します。

特定のプロパティ値をもつオブジェクトの配列を作成するか,コンストラクターが他の入力を必要とする場合は,プロトタイプオブジェクトを使用してこの情報を提供します。

クラスは,クラス名の構文とプロトタイプオブジェクトの構文の両方をサポートすることができます。

关节真正的と关数错误的でクラス名の构文を実装することができます。ただし,既定ではこれらの关数はその构文をサポートしません。

プロトタイプメソッドが存在しない场合に呼び出されるクラス名メソッド

使用するクラスがクラス名の構文を実装しているが,特定の関数に対するプロトタイプオブジェクトの構文を実装しない場合でも,両方の構文を呼び出すことができます。たとえば,静的Zeros.メソッドのみを実装する場合,次の構文を呼び出せます。

零(...'喜欢'MyClass(…))

プロトタイプオブジェクトの构文を呼び出す场合,MATLABは最初にzerosLikeという名前のメソッドを検索します。马铃薯がメソッドを検出できなかった場合、Zeros.静的メソッドを呼び出します。

この机能は,配列の作成にクラス名のみが必要な场合に便利です。完全な配列作成关数の构文をサポートするために,両方のメソッドを実装する必要はありません。クラス名の构文のみを実装する场合,プロトタイプオブジェクトの构文の呼び出しは,クラス名の构文の呼び出しと同じです。

配列作成关数に対するサポートの実装

配列作成关数をサポートするには,2つの异なるメソッドを使用します。一方のメソッドはクラス名の构文を実装し,他方のメソッドはプロトタイプオブジェクトの构文を実装します。

たとえば,关数Zeros.をサポートするには,次のようにします。

  • クラス名の构文を

    零(..., '类名')

    静止的メソッドとして実装します。

    方法(静止的)函数Z =零(varargin)...结尾结尾
  • プロトタイプオブジェクトの构文は,

    零(...'喜欢',OBJ)

    字符ベクトル'喜欢'が名前に付加されたメソッドとして実装します。

    方法(隐)函数z = zerosLike(obj,varargin)…结尾结尾

马铃薯による関数呼び出しの解釈

构文の解釈により配列作成关数に対する特别なサポートが得られます。

  • 次の形式の关数Zeros.を呼び出すと,

    零(...'班级名称'

    次の構文でクラスの静的メソッドが呼び出されます。

    ClassName.zeros(变长度输入宗量{1:end-1})
  • 次の形式の关数Zeros.を呼び出すと,

    零(...'喜欢',OBJ)

    次の構文でクラスメソッドが呼び出されます。

    zerosLike(OBJ,varargin {1:端-2})

全関数入力のサポート

配列作成关数の入力引数には,关数が返す配列の次元や,必要に応じてその他の引数も含めることができます。一般に,メソッドがサポートしなければならない3つのケースがあります。

  • 次元の入力引数が存在せず,结果としてスカラーが返される。以下に例を示します。

    Z =零(“MyClass”);
  • 1つ以上の次元が0以下であり,結果として空配列になる。以下に例を示します。

    Z =零(2,0,“MyClass”);
  • 任意の数の有効な配列次元が配列のサイズを指定している。以下に例を示します。

    Z =零(2,3,5,“MyClass”);

配列作成关数がクラスメソッドを呼び出す际,クラス名またはリテラル'喜欢'を除く,入力引数とオブジェクト変数をメソッドに渡します。メソッドは次のシグネチャを使って実装できます。

  • 「クラス名」メソッドの场合:零(varargin)

  • 「像を指定したプロトタイプオブジェクト」メソッドの场合:零(OBJ,varargin)

サンプルクラス

颜色クラスは,RGB.HSV.など,特定の色空间における色を表します。クラス名メソッドの実装プロトタイプオブジェクトメソッドの実装の说明では,オーバーロードメソッドを実装するための基本としてこのクラスを使用しています。

Classdef.颜色属性ColorValues = [0,0,0]的ColorSpace =“RGB”结尾方法函数OBJ =颜色(cSpace,值)如果nargin> 0 obj.ColorSpace = cSpace;obj.ColorValues =值;结尾结尾结尾结尾

クラス名メソッドの実装

关节Zeros.は,最后の班级名称字符ベクトルを取り除き,それを使用して颜色クラスの静的メソッドの呼び出しを作成します。静的メソッドに渡される引数は,配列次元引数です。

以下に,颜色クラスに対するZeros.メソッドの実装を示します。この実装により,以下が実行されます。

  • Zeros.メソッドを静止的として定义します(必须)。

  • Zeros.の呼び出しに次元の引数がない场合はスカラー颜色オブジェクトを返します。

  • Zeros.の呼び出しが0の次元引数をもつ場合は空配列を返します。

  • 既定の颜色オブジェクトの配列を返します。关数repmatを使用して,Zeros.の呼び出しによって指定された次元の配列を作成します。

Classdef.颜色......方法(静止的)函数Z =零(varargin)如果(nargin == 0)%对于零(“颜色”)Z =颜色;eleesif任何([{varargin:}] <= 0)%对于任何尺寸的零<= 0Z = Color.empty(varargin {:});别的%对于零(M,N,..., '颜色')%用途属性的默认值Z = repmat(彩色,varargin {:});结尾结尾结尾结尾

Zeros.メソッドは,このアプリケーションに适しているColorValuesプロパティの既定値を使用します。たとえば,那些メソッドの実装により,ColorValuesプロパティを(1, 1, 1)に设定できます。

次の目的を达成するために关数兰迪をオーバーロードすると仮定します。

  • ColorValueプロパティを,1から指定最大値までの范囲の値(たとえば1〜255)を取る1行3列の配列として定义する。

  • スカラー,空,多次元の配列サイズに対応している。

  • それぞれ无作为なColorValuesにより,指定された次元の颜色オブジェクトの配列が返される。

Classdef.颜色......方法(静止的)函数R =兰迪(varargin)如果(nargin == 0)兰迪%('名称')R =颜色(“RGB”,兰迪(255,[1,3]));eleesif任何([varargin {2:端}] <= 0)%对于具有任何尺寸兰迪<= 0R = Color.empty(varargin {2:端});别的兰迪% (max, m, n,…,“名称”)如果numel([{varargin:}])<2误差('没有足够的输入参数'结尾DIMS = [varargin {2:端}];R =零(变暗,“颜色”);为了K = 1:PROD(变暗)R(k)的=颜色(“RGB”,兰迪(varargin {1},[1,3]));结尾结尾结尾结尾结尾

プロトタイプオブジェクトメソッドの実装

“像” を指定したプロトタイプオブジェクトなど,オブジェクトの配列を返すメソッドの目的は,クラスの必要条件によって异なります。颜色クラスの場合,zeroLikeメソッドはプロトタイプオブジェクトの色彩空间プロパティ値をもつオブジェクトを作成しますが,ColorValuesはすべて0になります。

以下に,颜色クラスを対象とするzerosLikeメソッドの実装を示します。この実装により,以下が実行されます。

  • zerosLikeメソッドをとして定义します。

  • 关节Zeros.の呼び出しに次元の引数がない场合はスカラー颜色オブジェクトを返します。

  • 关节Zeros.の呼び出しが負または0の次元引数をもつ場合は空配列を返します。

  • 关节Zeros.の呼び出しによって指定された次元の颜色オブジェクトの配列を返します。

Classdef.颜色......方法(隐)函数Z = zerosLike(OBJ,varargin)如果输入参数个数= = 1%对于零( '喜欢',OBJ)cSpace = obj.ColorSpace;Z =颜色;z.ColorSpace = cSpace;eleesif任何([{varargin:}] <= 0)%对于任何尺寸的零<= 0Z = Color.empty(varargin {:});别的%对于零(M,N,..., '喜欢',OBJ)如果〜isscalar(OBJ)错误(“Prototype对象必须是标量”结尾OBJ =颜色(obj.ColorSpace,零(1,3,'喜欢'obj.ColorValues));z = repmat (obj,变长度输入宗量{:});结尾结尾结尾结尾

クラスの完全なリスト

以下に,オーバーロードされたメソッドのある颜色クラス定义を示します。

メモ

実际颜色クラスには,エラーチェック,色空間変換などが必要です。この非常に単純化されたバージョンは,オーバーロードされたメソッドの実装を表しています。

Classdef.颜色属性ColorValues = [0,0,0]的ColorSpace =“RGB”结尾方法函数OBJ =颜色(cSpace,值)如果nargin> 0 obj.ColorSpace = cSpace;obj.ColorValues =值;结尾结尾结尾方法(静止的)函数Z =零(varargin)如果(nargin == 0)%对于零(“类名”)Z =颜色;eleesif任何([{varargin:}] <= 0)%对于任何尺寸的零<= 0Z = Color.empty(varargin {:});别的% 0 (m, n,…,“名称”)%用途属性的默认值Z = repmat(彩色,varargin {:});结尾结尾函数R =兰迪(varargin)如果(nargin == 0)兰迪%('名称')R =颜色(“RGB”,兰迪(255,[1,3]));eleesif任何([varargin {2:端}] <= 0)%对于具有任何尺寸兰迪<= 0R = Color.empty(varargin {2:端});别的兰迪% (max, m, n,…,“名称”)如果numel([{varargin:}])<2误差('没有足够的输入参数'结尾DIMS = [varargin {2:端}];R =零(变暗,“颜色”);为了K = 1:PROD(变暗)R(k)的=颜色(“RGB”,兰迪(varargin {1},[1,3]));结尾结尾结尾结尾方法(隐)函数Z = zerosLike(OBJ,varargin)如果输入参数个数= = 1%对于零( '喜欢',OBJ)cSpace = obj.ColorSpace;Z =颜色;z.ColorSpace = cSpace;eleesif任何([{varargin:}] <= 0)%对于任何尺寸的零<= 0Z = Color.empty(varargin {:});别的%对于零(M,N,..., '喜欢',OBJ)如果〜isscalar(OBJ)错误(“Prototype对象必须是标量”结尾OBJ =颜色(obj.ColorSpace,零(1,3,'喜欢'obj.ColorValues));z = repmat (obj,变长度输入宗量{:});结尾结尾结尾结尾

关键词トピック