メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

名前空間の作成

名前空間は、クラス フォルダー、クラス定義ファイル、関数ファイル、およびその他の名前空間 ("内部名前空間" と呼ばれる) を含めることができる特別なフォルダーです。名前空間を使用すると、コードを整理し、コード内に含まれる項目に対してより堅牢な名前を作成するのに役立ちます。関数名とクラス名は、特定の名前空間内で一意である必要があります。関数とクラスはその名前空間にスコープ設定されているため、別の名前空間でそれらの名前を再利用できます。

名前空間フォルダー

フォルダー名の先頭に + 文字を追加して名前空間を定義します。たとえば、名前空間フォルダー +mynamesp には、クラス、列挙クラス、関数、内部名前空間、および内部名前空間内のクラス フォルダー内の 2 つ目のクラスが含まれています。

+mynamesp
+mynamesp/MyClass.m
+mynamesp/WeekdaysEnum.m
+mynamesp/myFunction.m
+mynamesp/+innernamesp/@MySecondClass/MySecondClass.m

メモ

このフォルダー階層は、あくまで例として示したものです。これは MATLAB® インストールには含まれていません。機能を試すには、これらのフォルダーとコードを独自のパスで定義してください。

MATLAB からアクセスできるようにするには、名前空間フォルダーの親フォルダーがパス上にある必要があります。名前空間フォルダー自体をパスに追加しようとすると、エラーが発生します。詳細については、名前空間と MATLAB パスを参照してください。

名前空間内のコードの定義

他のコードと同様に、名前空間のメンバーを定義します。定義に名前空間名を含めないでください。たとえば、名前空間フォルダーに示されているサンプル階層では、myFunction の定義には関数名のみが含まれます。

function z = myFunction(x)
  ...
end

同様に、MyClass の定義にはクラス名のみが含まれます。

classdef MyClass
  ...
end

名前空間メンバーの参照

ほとんどの名前空間メンバーを参照するには、メンバー名の先頭に名前空間名とドットを追加します。たとえば、このステートメントは、mynamesp に含まれる MyClass のインスタンスを作成します。(名前空間フォルダーに示されているサンプル階層を参照してください。)

obj = mynamesp.MyClass(arg1,arg2);

名前空間で定義されたコードの呼び出しでは、呼び出しが名前空間自体の内部にある場合でも、名前空間名を含める必要があります。たとえば、myFunctionMyClass によってプロパティ検証関数として使用される場合、関数名に名前空間を含める必要があります。

classdef MyClass
   properties
      myProp {mynamesp.myFunction}
   end
end

名前空間コードへの外部アクセスを簡素化するために、名前空間からコードをインポートできます。インポートされたコードを呼び出す場合、名前空間名は必要ありません。詳細については、関数への名前空間メンバーのインポートを参照してください。

クラス フォルダー

クラスがクラス フォルダー (@ フォルダー) で定義されている場合、クラス フォルダー名は名前空間名の一部ではありません。たとえば、MySecondClass のオブジェクトを構築する場合は、次の構文を使用します。

obj = mynamesp.innernamesp.MySecondClass(arg1,arg2);

メソッド

クラスの非静的メソッドを呼び出す場合、そのクラスのオブジェクトが存在し、既に名前空間にスコープ設定されているため、名前空間名は必要ありません。MyClass のインスタンスである objmyMethod メソッドを呼び出す場合、通常の構文に従います。

obj.myMethod(arg)
myMethod(obj,arg)

静的メソッドには常に完全なクラス名と名前空間が必要です。

mynamesp.myClass.stMethod(arg)

プロパティ

インスタンスのパブリック プロパティには、非静的メソッドと同様に、完全な名前空間を使用せずにアクセスできます。ただし、クラスの特定のインスタンスを使用せずにそのクラスの定数プロパティにアクセスするには、完全な名前空間が必要です。たとえば、MyClass で定数プロパティ ConstProp が定義されている場合、その定数プロパティには、完全な名前空間を使用してアクセスします。

x = mynamesp.MyClass.ConstProp;

MyClass のインスタンスが既に存在する場合は、完全な名前空間を使用せずに ConstProp にアクセスできます。

y = mynamesp.MyClass;
c = y.ConstProp;

列挙

名前空間内の列挙メンバーを参照するには、完全な名前空間名を使用します。たとえば、以下は mynamesp 内の WeekdaysEnum の可能な定義です。

classdef WeekdaysEnum
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

完全な名前空間を使用して、列挙メンバー Monday を変数に代入します。

day = mynamesp.WeekdaysEnum.Monday;

名前空間と MATLAB パス

名前空間内のコードを呼び出すには、最上位の名前空間の親フォルダーを MATLAB パスに追加する必要があります。親フォルダーが MATLAB パス上にない場合は、名前空間フォルダーが現在のフォルダーであっても、名前空間メンバーにアクセスできません。

MATLAB による重複した名前の処理方法

同じ名前をもつ名前空間

名前空間フォルダーが、パス上の後続位置にある、同じ名前をもつ他の名前空間フォルダーより優先されることはありません。2 つ以上の最上位の名前空間の名前が同じである場合、MATLAB はそれらを 1 つの名前空間として扱います。異なるパス フォルダー内の、同じ名前をもつ 2 つの名前空間で同じ関数名が定義されている場合、MATLAB はこれらの関数のうち 1 つだけを検出します。

名前空間関数と静的メソッド

名前空間関数と静的メソッドの名前が同じ場合、名前空間関数が静的メソッドよりも優先されます。たとえば、パス フォルダー fldrA に名前空間関数 bar が含まれていて、パス フォルダー fldrB にクラス foo の静的メソッド bar が含まれているとします。

fldrA/+foo/bar.m  % bar is a function in namespace foo
fldrB/@foo/bar.m  % bar is a static method of class foo

which コマンドを使用して、名前空間関数が優先されることを示します。

which foo.bar
fldrA\+foo\bar.m

internal 名前空間

MathWorks® は、internal という名前の名前空間の使用を予約しています。internal という名前の名前空間に含まれているコードは MathWorks 専用であり、このコードの使用は推奨されません。このコードは、リリースごとに一貫して動作することが保証されません。該当する関数およびクラスは、予告なしに今後のリリースで MATLAB ソフトウェアから削除される可能性があります。

参考

トピック