主要内容

異種混合配列コンストラクタ

ス,パ,クラスコンストラクタ,での配列の作成

異種混合クラス階層のサブクラスがそのスーパークラスを呼び出してオブジェクトの配列を作成する場合,スーパークラスコンストラクターが異種混合配列をサブクラスに返さないようにしなければなりません。以下のプログラミングパターンは,正しくないクラスをサブクラスコンストラクターに返すことによって発生するエラーを回避する方法を示します。

エラ,が発生する可能性がある状況

コンストラクタ,は定義クラスと同じクラスのオブジェクトを返さなければなりません。異種混合クラス階層のオブジェクトを扱う場合,異なるクラスの配列要素を追加するとオブジェクト配列のクラスが変わります。このため,クラス設計で以下の手法がすべて必要になる場合,異種混合スーパークラスコンストラクターはオブジェクト配列のクラスを変更する可能性があります。

  • サブクラスコンストラクタ,でオブジェクト配列を作成する

  • サブクラスコンストラクタ,からス,パ,クラスコンストラクタ,を呼び出して引数を渡す

  • ス,パ,クラスコンストラクタ,でオブジェクト配列を作成する

さらに,以下のいずれかに該当します。

  • ル,トス,パ,クラスが抽象型ではなく,getDefaultScalarElementメソッドを実装していない。

  • ル,トス,パ,クラスが,サブクラスと同じクラスではないオブジェクトを返すgetDefaultScalarElementメソッドを実装している。

オブジェクト配列への代入を行うときに,matlab®は既定のオブジェクトを使用して,代入されていない配列要素を埋めます。異種混合階層では,既定のオブジェクトをサブクラスコンストラクターによって呼び出されるスーパークラスにすることができます。このため,ス,パ,クラスコンストラクタ,で配列を作成することにより,異種混合配列を作成できます。

スーパークラスコンストラクターがサブクラスコンストラクターに異種混合配列を返すと,MATLABはエラーを生成します(潜在的なエラを参照)。

ス,パ,クラスコンストラクタ,での配列の初期化

エラ,を回避するには,ス,パ,クラスコンストラクタ,でオブジェクト配列を明示的に初期化します。たとえば,オブジェクトのス,パ,クラス部分を初期化する前に,ス,パ,クラスコンストラクタ,でrepelemを使用して配列を初期化します。配列の初期化により,配列に代入されたすべての要素が確実にobj引数と同じクラスになるようにします。

このコ,ドでは,ス,パ,クラスコンストラクタ,は入力引数参数の要素ごとに1のオブジェクトを作成します。

方法函数obj = SuperClass(arg)…N =数字(参数);Obj = repelem(Obj,1,n);K = 1:n obj(K)。SuperProp = arg(k);结束...结束结束

サブクラスコンストラクタ,は,ス,パ,クラスコンストラクタ,を呼び出して必須の引数配列一个を渡します。

方法函数obj =子类(a)obj = obj@SuperClass(a);K = 1:数值(a) obj(K)。SubProp = a(k);结束结束结束

サンプル実装

以下のクラス階層は,コンストラクタ,でオブジェクト配列を作成するサブクラスを定義します。階層のルトスパクラスは,配列のオブジェクトのスパクラス部分を初期化します。

このクラス階層はエンジニアリングチ,ムのメンバ,を表します。階層のクラスには,次のものが含まれます。

  • 颇具挑战性- - - - - -ProjectEngineerなど,特定のチ,ムメンバ,のクラスのス,パ,クラス。颇具挑战性的名字プロパティとPhoneXプロパティを定義し,matlab.mixin.Heterogeneousから派生します。

  • ProjectEngineer—エンジニアであるチムメンバ。各@ @ンスタンスは的名字プロパティとPhoneXプロパティを継承し,請求のプロパティを定義します。

  • その他のメンバ-簡略化するため,この例ではその他のチムメンバのタプは実装されません。

颇具挑战性クラスは異種混合階層のル,トであり,具象クラスです。的名字プロパティとPhoneXプロパティに値を代入する前に,コンストラクタ,はサブクラス(ProjectEngineer)オブジェクトの配列を初期化します。

ProjectEngineerコンストラクタ,は,repelemの呼び出しのために,次のステ,トメントを使用してobj引数を提供します。

obj = obj@TeamMembers(varargin{1:2});

颇具挑战性クラスは次のようになります。

classdefTeamMembers < matlab.mixin.Heterogeneous属性名字PhoneX结束方法函数obj = TeamMembers(nme,ext)如果Nargin > 0 n =数字(nme);Obj = repelem(Obj,1,n);K = 1:n obj(K)。Name = nme{k};obj (k)。PhoneX= ext(k);结束其他的obj。Name =结束结束结束结束

ProjectEngineerクラスはチムメンバの1のタプを表します。このクラスは配列入力をサポ,トし,オブジェクトの配列を返します。

classdefProjectEngineer < TeamMembers%输入:{名称},[PhoneX],{速率}属性结束方法函数obj = ProjectEngineer(varargin) obj = obj@TeamMembers(varargin{1:2});K = 1:数值(varargin{1}) obj(K)。Rate = varargin{3}{k};结束结束结束结束

ProjectEngineerクラスでは,チーム内のエンジニアごとに,名前の细胞配列,内線電話番号の数値配列,および請求料率の细胞配列が必要です。

Nm = {“弗雷德”“南希”“克劳德特”};Px = [8112,8113,8114];Rt = {C2的“B1”“A2”};tm = projectenengineer (nm,px,rt)
tm = 1x3 ProjectEngineer数组,属性为:速率名称PhoneX

潜在的なエラ

颇具挑战性コンストラクタ,は,次のステ,トメントを使用してオブジェクト配列を初期化します。

Obj = repelem(Obj,1,n);

repelemobj引数はProjectEngineerオブジェクトであるため,返される配列は同じクラスになります。

このステ,トメントを使用しないと,颇具挑战性コンストラクタ,は既定のオブジェクトを作成してル,プで配列要素を埋めます。結果として得られる異種混合配列は、共通ス、パ、クラス(この場合は.颇具挑战性)のクラスになります。スーパークラスがこの異種混合配列をサブクラスコンストラクターに返すと,クラスコンストラクターは返されたオブジェクトのクラスを保持しなければならないというルールの違反になります。

Matlabは次のエラ,を発行します。

在构造类'ProjectEngineer'的实例时,构造函数必须保留返回对象的类。ProjectEngineer中的错误(第8行)obj = obj@TeamMembers(varargin{1:2});

関連するトピック