Main Content

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

許可されたサブクラスの指定

基礎知識

この節では、以下の内容について理解していることを前提に説明を進めます。

許可されたサブクラスを制御する理由

クラス定義で、サブクラスとして許可するクラスの一覧を指定できます。一覧に含まれないクラスは、クラスのサブクラスとして定義できません。許可されたサブクラスを指定するには、AllowedSubclasses クラス属性を使用します。

AllowedSubclasses 属性は、サブクラス化を許可しない Sealed クラスと、サブクラス化を制限しない既定の動作との間の設計点を提供します。

許可されたサブクラスを制御することにより、シールされたクラスの階層を作成できます。つまり、これは、特定のクラス セットが特定の基底クラスから派生することは許可するが、無制限のサブクラス化は許可しないクラス システムです。

この手法の詳細は、クラスのシールされた階層の定義を参照してください。

許可されたサブクラスの指定

meta.class オブジェクトを AllowedSubclasses 属性に割り当てて、1 つまたは複数の許可されたサブクラスのリストを classdef ステートメントで指定します。? 演算子と次のクラス名を使って、特定のクラスを参照する meta.class オブジェクトを作成します。

classdef (AllowedSubclasses = ?ClassName) MySuperClass
   ...
end

meta.class オブジェクトの cell 配列を使って、複数の許可されたサブクラスを定義します。

classdef (AllowedSubclasses = {?ClassName1,?ClassName2,...?ClassNameN}) MySuperClass
   ...
end

クラス名を参照するときは、常に完全修飾クラス名を使用します。

classdef (AllowedSubclasses = ?Package.SubPackage.ClassName1) MySuperClass
   ...
end

空の cell 配列を AllowedSubclasses 属性に割り当てることは、Sealed クラスを定義することと同じです。

classdef (AllowedSubclasses = {}) MySuperClass
   ...
end

メモ

meta.class オブジェクトの生成には、? 演算子とクラス名のみを使用します。AllowedSubclasses 属性に代入する値には、meta.class オブジェクトまたは meta.class オブジェクトの cell 配列を返す関数も含めて、他のいかなる MATLAB® 式も使用できません。

許可されたサブクラス宣言の結果

クラスを AllowedSubclasses のリストに含めても、そのクラスはサブクラスとして定義されません。ユーザーにそのクラスをサブクラスとして定義するように要求もしません。リストに含めると、参照されたクラスがサブクラスとして定義できるようになるだけです。

許可されたサブクラスとしてクラスを宣言しても、このクラス自身がサブクラス化できるかどうかには影響しません。

クラス定義には、現在定義されていないクラスや MATLAB パス上で利用できないクラスを参照する AllowedSubclasses 属性への割り当てを含めることができます。クラスを読み込むときに MATLAB が検出できない参照サブクラスは、エラーや警告なしにリストから事実上削除されます。MATLAB は、その後に使用可能になる場合に備えてその参照クラスを記憶します。

メモ

MATLAB が許可されたサブクラスのリストからクラスを検出しない場合、そのクラスは事実上 Sealed になっています。シールされたクラスは AllowedSubclasses = {} と同じです。

クラスが Sealed であるか、または AllowedSubclasses を指定しているかを判別するには、meta.class プロパティ RestrictsSubclassing を使用します。

クラスのシールされた階層の定義

AllowedSubclasses 属性を使うと、次のように、許可されたサブクラスをシールして、シールされたクラスの階層を定義できます。

classdef (AllowedSubclasses = {?SubClass1,?SubClass2}) SuperClass
   ...
end

許可されたサブクラスを Sealed として定義します。

classdef (Sealed) SubClass1
   ...
end

classdef (Sealed) SubClass2
   ...
end

シールされたクラス階層を使うと、閉じたクラス システムを維持しながら、設計に必要な抽象化のレベルを使用できます。

関連するトピック