主要内容

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

クラスコンストラクターメソッド

クラスコンストラクターメソッドの目的

コンストラクターメソッドは,そのクラスのインスタンスを作成する特殊な関数です。一般に,コンストラクターメソッドは,プロパティに保存されるデータを割り当て,初期化されたオブジェクトを返すために,入力引数を受け入れます。

基本的な例については,単純なクラスの作成を参照してください。

クラスコンストラクターを明示的に定義しないMATLAB®クラスには既定のコンストラクターメソッドがあります。このメソッドは,入力引数なしで作成されたクラスのオブジェクトを返します。クラスは、既定のコンストラクターをオーバーライドするコンストラクター メソッドを定義できます。明示的に定義されたコンストラクターは、入力引数の受け入れ、プロパティ値の初期化、その他のメソッドの呼び出し、クラスのオブジェクトを作成するために必要なその他の操作を行うことができます。

コンストラクターメソッドの基本構造

コンストラクターメソッドは,3つの基本的な部分から構成されます。

  • 初期化前——スーパークラスコンストラクターの引数を求めます。

  • オブジェクトの初期化——スーパークラスのコンストラクターを呼び出します。

  • 初期化後——オブジェクトへの参照と割り当て,クラスメソッドの呼び出し,関数へのオブジェクトの渡しなどを含む,サブクラスに関連する操作を実行します。

次のコードは,各セクションで実行される基本の操作を説明します。

classdefConstructorDesign < BaseClass1属性ComputedValue结束方法函数obj = ConstructorDesign (a, b, c)%%预初始化%%%不使用输出参数的代码(obj)如果输入参数个数= = 0为超类构造函数提供值%并初始化其他输入一个= someDefaultValue;args {1} = someDefaultValue;args {2} = someDefaultValue;其他的% When nargin ~= 0, assign to cell array,%传递给父类构造函数args {1} = b;args {2} = c;结束compvalue = myClass.staticMethod(一个);对象初始化%%%在访问对象之前调用超类构造函数您不能将此语句条件化obj = obj@BaseClass1 (args {:});%%初始化后%%%任何代码,包括对object的访问obj.classMethod (arg);obj。ComputedValue = compvalue;...结束...结束...结束

任意の関数のようにコンストラクターを呼び出し,引数を渡してクラスのオブジェクトを返します。

obj = ConstructorDesign (a, b, c);

コンストラクターのガイドライン

  • コンストラクターはクラスと同じ名前をもちます。

  • コンストラクターは複数の引数を返すことができますが,最初の出力は作成されたオブジェクトでなければなりません。

  • 出力引数を割り当てない場合,コンストラクター内のオブジェクト変数をクリアできます(出力オブジェクトの抑制を参照)。

  • クラスコンストラクターを作成する場合は,入力引数なしで呼び出せるようにします。入力引数なしでコンストラクターを呼び出す条件を参照してください。

  • コンストラクターがスーパークラスコンストラクターを明示的に呼び出す場合,この呼び出しは構築されるオブジェクトへの他の参照より前に行わなければならず,また,返回ステートメントの後に行うことはできません。

  • スーパークラスコンストラクターを,条件付きで呼び出すことはできません。スーパークラスのコンストラクターの呼び出しは,ループ,条件文,スイッチ,try / catch,入れ子関数内に置くことはできません。詳細は,スーパークラスコンストラクターの条件なしの呼び出しを参照してください。

既定のコンストラクター

クラスでコンストラクターが定義されていない場合,MATLABは引数を取らずにスカラーオブジェクトを返す既定のコンストラクターを提供します。このオブジェクトのプロパティは既定値に初期化されています。また,MATLABが提供する既定のコンストラクターは,引数なしで,または既定のサブクラスコンストラクターに渡される任意の引数を指定してあらゆるスーパークラスコンストラクターを呼び出します。

サブクラスがコンストラクターを定義しない場合は,既定のコンストラクターはその入力を直接のスーパークラスコンストラクターに渡します。この動作は,サブクラスでコンストラクターを定義する必要はないが,スーパークラスコンストラクターが入力引数を必要とする場合に役立ちます。

コンストラクターを定義する場合

既定のコンストラクターでは実行できないオブジェクトの初期化を実行するコンストラクターメソッドを定義します。たとえば,クラスのオブジェクトを作成する場合に,以下が必要になります。

  • 入力引数

  • クラスの各インスタンスについて,プロパティ値などのオブジェクトの状態の初期化

  • サブクラスコンストラクターにより決定される値を使用したスーパークラスコンストラクターの呼び出し

関連情報

列挙の作成に固有の情報については,列挙クラスコンストラクターの呼び出しシーケンスを参照してください。

コンストラクターでのオブジェクト配列の作成の詳細については,オブジェクト配列の作成を参照してください。

作成されているクラスがサブクラスである場合,MATLABは,オブジェクトを初期化するために各スーパークラスのコンストラクターを呼び出します。スーパークラスコンストラクターを間接的に呼び出すときには,引数なしで行われます。スーパークラスコンストラクターが引数を必要とする場合,サブクラスコンストラクターから明示的に呼び出します。コンストラクターを呼び出す順序の制御を参照してください。

コンストラクターでのオブジェクトの初期化

コンストラクターメソッドは,初期化されたオブジェクトを,出力引数として返します。出力引数は,コードの最初の行を実行する前に,コンストラクターが実行するときに作成されます。

たとえば,次のコンストラクターでは,オブジェクトobjMyClassのインスタンスに割り当てられているので,最初のステートメントとしてオブジェクトのプロパティ一个の値を割り当てることができます。

函数obj = MyClass(a,b,c)一个=;...结束

オブジェクトは既に初期化されているので,コンストラクターから他のクラスメソッドを呼び出すことができます。

コンストラクターは,プロパティが既定値をもつオブジェクトも作成します。既定値は([])またはプロパティ定義ブロックで指定された既定値のいずれかです。

たとえば,このコンストラクターは入力引数の演算を行い价值プロパティの値に代入します。

函数obj = MyClass(a,b,c)Value = (a + b) / c;...结束

コンストラクターのオブジェクトの参照

プロパティに値を代入するなどしてオブジェクトを初期化するときには,コンストラクター内でオブジェクトを参照するために,出力引数の名前を使用します。たとえば,以下のコードにおいて出力引数はobjであり,このオブジェクトはobjとして参照されます。

% obj是正在构造的对象函数obj = MyClass(arg)propert1 =参数* 10;obj.method1;...结束

既定のプロパティ値の定義についての詳細は,プロパティの既定値を参照してください。

入力引数なしでコンストラクターを呼び出す条件

入力引数なしでコンストラクターを呼び出すことが必要な場合があります。

  • オブジェクトをワークスペースに読み込むとき,クラスのConstructOnLoad属性が真正的に設定されると,関数负载は引数なしでクラスコンストラクターを呼び出します。

  • 値が指定されていない要素をもつオブジェクト配列を作成または拡張するとき,未指定の要素を埋めるために,クラスコンストラクターが引数なしで呼び出されます(たとえば1 x(10日)= MyClass (a, b, c);)。この場合,コンストラクターが引数なしで1回呼び出され,この1つのオブジェクトのコピーを空の配列要素(x (1:9, 1))に与えます。

コンストラクターは,入力引数がないときには,既定のプロパティ値のみを使用してオブジェクトを作成します。上記2つのケースのいずれかが起こるときには,エラーを回避するために,クラスコンストラクターにゼロ引数のチェックを追加するのが適切です。

函数obj = MyClass (a, b, c)如果Nargin > 0 obj。一个=;obj。B = B;obj.C = c;...结束结束

スーパークラスコンストラクターを取り扱う方法については,コンストラクターメソッドの基本構造を参照してください。

サブクラスコンストラクター

サブクラスコンストラクターは,スーパークラスコンストラクターに引数を渡すためにスーパークラスコンストラクターを明示的に呼び出すことができます。サブクラスコンストラクターは、スーパークラス コンストラクターの呼び出しでこれらの引数を指定しなければならず、さらにコンストラクター出力引数を使用して、呼び出しを作成しなければなりません。構文は、以下のとおりです。

classdefMyClass <超类方法函数obj = MyClass(a,b,c,d) obj@SuperClass(a,b);...结束结束结束

サブクラスコンストラクターは,スーパークラスコンストラクターに対するすべての呼び出しを,そのオブジェクト(obj)への他の参照の前に行わなければなりません。この制限には,プロパティ値の代入や通常のクラスメソッドの呼び出しが含まれます。また,サブクラスコンストラクターがスーパークラスコンストラクターを呼び出せるのは1回だけです。

指定されたスーパークラスのみの参照

classdefがクラスをスーパークラスとして指定していない場合,コンストラクターが次の構文でスーパークラスコンストラクターを呼び出すことはできません。すなわち,サブクラスコンストラクターはclassdef行にリストされた直接のスーパークラスコンストラクターのみ呼び出すことができます。

classdefMyClass < SuperClass1 & SuperClass2

MATLABは,呼び出されていないコンストラクターをclassdef行で指定された左から右の順序で呼び出します。MATLABはこれらの呼び出しに引数を渡しません。

スーパークラスコンストラクターの条件なしの呼び出し

スーパークラスコンストラクターの呼び出しは無条件でなければなりません。特定のスーパークラスに対しては1回の呼び出ししかできません。プロパティ値の代入やクラスメソッドの呼び出しなどでオブジェクトを使用する前に,スーパークラスコンストラクターを呼び出してオブジェクトのスーパークラスの部分を初期化します。

何らかの条件に依存する複数の引数で複数のスーパークラスコンストラクターを呼び出すには,引数の细胞配列を作成し,コンストラクターの呼び出しを1回にします。

たとえば,多维数据集クラスコンストラクターは,引数なしで多维数据集コンストラクターが呼び出される場合,既定値を使ってスーパークラス形状コンストラクターを呼び出します。多维数据集コンストラクターが4つの入力引数を指定して呼び出される場合は,upvectorおよびviewangleをスーパークラスコンストラクターに渡します。

classdef多维数据集<形状属性[0 0 0]结束方法函数cubeObj =立方体(长度、颜色、upvector viewangle)汇编超类构造函数参数如果Nargin == 0 super_args{1} = [0 0 1];super_args {2} = 10;elseifNargin == 4 super_args{1} = upvector;super_args {2} = viewangle;其他的错误('输入参数错误'结束调用超类构造函数cubeObj@Shape (super_args {:});如果提供属性值,指定属性值如果nargin > 0 cubeObj。SideLength =长度;cubeObj。颜色=颜色;结束...结束...结束结束

引数なしまたは複数の引数をもつスーパークラス

引数なしでスーパークラスコンストラクターを呼び出す構文をサポートする場合は,構文を明示的に提供します。

多维数据集クラスの例の場合で考えます。この例では,形状スーパークラスと多维数据集サブクラス内のすべてのプロパティ値は,クラス定義内で指定された既定値を取ります。この場合,スーパークラスコンストラクターまたはサブクラスコンストラクターに対し引数を一切指定せずに,多维数据集のインスタンスを作成できます。

以下では,多维数据集コンストラクターでこの動作をどのように実装できるかを示します。

方法函数cubeObj =立方体(长度、颜色、upvector viewangle)汇编超类构造函数参数如果Nargin == 0 super_args = {};elseifNargin == 4 super_args{1} = upvector;super_args {2} = viewangle;其他的错误('输入参数错误'结束调用超类构造函数cubeObj@Shape (super_args {:});如果提供属性值,指定属性值如果nargin > 0 cubeObj。SideLength =长度;cubeObj。颜色=颜色;结束...结束结束

サブクラスの詳細

サブクラスの作成の詳細は,サブクラスコンストラクターの設計を参照してください。

継承されたコンストラクターの暗黙的な呼び出し

MATLABは,既定のサブクラスコンストラクターからスーパークラスコンストラクターへ引数を暗黙的に渡します。この動作により,スーパークラスコンストラクターへ引数を渡すためだけにサブクラスのコンストラクターメソッドを実装する必要がなくなります。

たとえば,次のクラスコンストラクターは1つの入力引数(datetimeオブジェクト)を必要とし,コンストラクターはそれをCurrentDateプロパティに割り当てます。

classdefBaseClassWithConstr属性CurrentDatedatetime结束方法函数obj = BaseClassWithConstr(dt)CurrentDate = dt;结束结束结束

BaseClassWithConstrのサブクラスを作成するが,そのサブクラスには明示的なコンストラクターメソッドが必要ないとします。

classdef SubclassDefaultConstr < BaseClassWithConstr…结束

スーパークラスの引数を指定して既定のコンストラクターを呼び出すことにより,SubclassDefaultConstrのオブジェクトを作成できます。

obj = SubclassDefaultConstr (datetime);

サブクラスコンストラクターの詳細については,サブクラスコンストラクター既定のコンストラクターを参照してください。

クラス作成中のエラー

ハンドルクラスでは,次の条件でエラーが発生するとMATLABによって删除メソッドが呼び出されます。

  • エラーが発生する前の部分で,コードにオブジェクトへの参照がある。

  • エラーが発生する前の部分で,コードに早期の返回ステートメントがある。

MATLABはそのオブジェクトに対する删除メソッド,プロパティに含まれているオブジェクトに対する删除メソッド,初期化された基底クラスに対する删除メソッドを呼び出します。

どの時点でエラーが発生するかによって,MATLABはオブジェクトが完全に作成される前にクラスデストラクターを呼び出すことができます。そのため,クラスの删除メソッドは,すべてのプロパティに値があるとは限らない,部分的に作成されたオブジェクトでも動作できなければなりません。詳細については,部分的に作成されたオブジェクトの破棄のサポートを参照してください。

オブジェクトがどのように破棄されるかについての詳細は,ハンドルクラスのデストラクターを参照してください。

出力オブジェクトの抑制

コンストラクターの呼び出しで出力変数が割り当てられていない場合,変数へのクラスインスタンスの代入を抑制できます。この手法は,作成されたオブジェクトに付随するグラフィカルインターフェイスウィンドウを作成するアプリで役立ちます。これらのアプリはオブジェクトを返す必要がありません。

nargoutを使用して,コンストラクターが出力引数と共に呼び出されたかどうかを判別します。たとえば,MyAppクラスのクラスコンストラクターは,出力を割り当てずに呼び出された場合,オブジェクト変数objをクリアします。

classdefMyApp方法函数obj = MyApp...如果Nargout == 0清除obj结束结束...结束结束

クラスコンストラクターがオブジェクトを返さない場合,MATLABはmeta.classInstanceCreatedイベントをトリガーしません。

関連するトピック