許可されたサブクラスの指定
許可されたサブクラスを制御する理由
クラス定義で、サブクラスとして許可するクラスの一覧を指定できます。一覧に含まれないクラスは、クラスのサブクラスとして定義できません。許可されたサブクラスを指定するには、AllowedSubclasses
クラス属性を使用します。
AllowedSubclasses
属性は、サブクラス化を許可しない Sealed
クラスと、サブクラス化を制限しない既定の動作との間の設計点を提供します。
許可されたサブクラスを制御することにより、シールされたクラスの階層を作成できます。つまり、これは、特定のクラス セットが特定の基底クラスから派生することは許可するが、無制限のサブクラス化は許可しないクラス システムです。
この手法の詳細については、クラスのシールされた階層の定義を参照してください。
許可されたサブクラスの指定
matlab.metadata.Class
オブジェクトを AllowedSubclasses
属性に割り当てて、1 つ以上の許可されたサブクラスのリストを classdef
ステートメントで指定します。?
演算子と次のクラス名を使って、特定のクラスを参照する matlab.metadata.Class
オブジェクトを作成します。
classdef (AllowedSubclasses = ?ClassName) MySuperClass ... end
matlab.metadata.Class
オブジェクトの cell 配列を使って、複数の許可されたサブクラスを定義します。
classdef (AllowedSubclasses = {?ClassName1,?ClassName2,...?ClassNameN}) MySuperClass ... end
クラス名を参照するときは、常に完全修飾クラス名を使用します。
classdef (AllowedSubclasses = ?namespace.inneramespace.ClassName1) MySuperClass ... end
空の cell 配列を AllowedSubclasses
属性に割り当てることは、Sealed
クラスを定義することと同じです。
classdef (AllowedSubclasses = {}) MySuperClass ... end
メモ
matlab.metadata.Class
オブジェクトの生成には、?
演算子とクラス名のみを使用します。AllowedSubclasses
属性に代入する値には、他のいかなる MATLAB® 式も含めることはできません。これには、matlab.metadata.Class
オブジェクトまたは matlab.metadata.Class
オブジェクトの cell 配列を返す関数も含まれます。
許可されたサブクラス宣言の結果
クラスを AllowedSubclasses
のリストに含めても、そのクラスはサブクラスとして定義されません。ユーザーにそのクラスをサブクラスとして定義するように要求もしません。リストに含めると、参照されたクラスがサブクラスとして定義できるようになるだけです。また、許可されたサブクラスとしてクラスを宣言しても、このクラス自身がサブクラス化できるかどうかには影響しません。
クラス定義には、現在定義されていないクラスや MATLAB パス上で利用できないクラスを参照する AllowedSubclasses
属性への割り当てを含めることができます。クラスを読み込むときに MATLAB が検出できない参照サブクラスは、エラーや警告なしにリストから事実上削除されます。MATLAB は、その後に使用可能になる場合に備えてその参照クラスを記憶します。
メモ
MATLAB が許可されたサブクラスのリストからクラスを検出しない場合、そのクラスは事実上 Sealed
になっています。シールされたクラスは AllowedSubclasses = {}
と同じです。
クラスが Sealed
であるか、または AllowedSubclasses
を指定しているかを判別するには、matlab.metadata.Class
プロパティの RestrictsSubclassing
を使用します。
クラスのシールされた階層の定義
AllowedSubclasses
属性を使うと、次のように、許可されたサブクラスをシールして、シールされたクラスの階層を定義できます。
classdef (AllowedSubclasses = {?SubClass1,?SubClass2}) SuperClass ... end
許可されたサブクラスを Sealed
として定義します。
classdef (Sealed) SubClass1 ... end classdef (Sealed) SubClass2 ... end
シールされたクラス階層を使うと、閉じたクラス システムを維持しながら、設計に必要な抽象化のレベルを使用できます。