このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
コンストラクターメソッドは,そのクラスのインスタンスを作成する特殊な関数です。一般に,コンストラクターメソッドは,プロパティに保存されるデータを割り当て,初期化されたオブジェクトを返すために,入力引数を受け入れます。
基本的な例については,単純なクラスの作成を参照してください。
クラスコンストラクターを明示的に定義しない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は,オブジェクトを初期化するために各スーパークラスのコンストラクターを呼び出します。スーパークラスコンストラクターを間接的に呼び出すときには,引数なしで行われます。スーパークラスコンストラクターが引数を必要とする場合,サブクラスコンストラクターから明示的に呼び出します。コンストラクターを呼び出す順序の制御を参照してください。
コンストラクターメソッドは,初期化されたオブジェクトを,出力引数として返します。出力引数は,コードの最初の行を実行する前に,コンストラクターが実行するときに作成されます。
たとえば,次のコンストラクターでは,オブジェクトobj
がMyClass
のインスタンスに割り当てられているので,最初のステートメントとしてオブジェクトのプロパティ一个
の値を割り当てることができます。
函数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.class
InstanceCreated
イベントをトリガーしません。