アクセス修飾子
アクセス修飾子(またはアクセス指定子)は、オブジェクト指向言語におけるキーワードであり、クラス、メソッド、その他のメンバーのアクセス可能性を設定します。アクセス修飾子は、コンポーネントのカプセル化を容易にするために使用されるプログラミング言語構文の特定の部分です。[1]
C++ではアクセス修飾子は3つしかありません。C #ではその数が6つに拡張されています[2]。一方、 Javaではアクセス修飾子は4つありますが、この目的のためのキーワードは3つです。Javaでは、キーワードがない場合はデフォルトでパッケージプライベート修飾子が使用されます。
クラスをpublicとして宣言すると、同じパッケージ内で定義された他のクラスだけでなく、他のパッケージ内で定義されたクラスからもアクセスできるようになります。これは、クラスに対して最も一般的に使用されるアクセス指定子です。ただし、クラス自体をprivateとして宣言することはできません。アクセス指定子が指定されていない場合は、デフォルトのアクセス制限が適用されます。クラスは同じパッケージ内の他のクラスからはアクセスできますが、パッケージ外のクラスからはアクセスできません。クラスがアクセスできないとは、単にそのクラスのオブジェクトを作成したり、そのクラス型の変数を宣言したりできないことを意味します。protectedアクセス指定子もクラスには適用できません。
キーワードの名前
publicC++ では、、、protectedおよびという 3 つの修飾子を使用します。[3] C# には、、、、、、、および という修飾子があります。[4] Java には、、、、があり、;privateはデフォルト で、public他のアクセス修飾子キーワードが指定さprotected れていない場合に使用されます。これらの修飾子の意味は言語によって異なる場合があります。最も制限の厳しいものから最も制限の緩いものの順に並べたキーワードと、これら 3 つの言語での意味の比較を以下に示します。それらの可視性は、同じクラスから、クラスが定義されているパッケージから一般的なアクセス許可までの範囲です。以下に、最大アクセスを表に示します。internalprivateprotected internalprivate protectedfile publicpackageprotectedprivatepackage
Swiftでは、エンティティが定義されているソースファイルとそのソースファイルを含むモジュールの両方に対して5つの異なるアクセスレベルがあります。[5]
| キーワード | C# | C++ | ジャワ | 迅速 |
|---|---|---|---|---|
private | クラス | クラス および/または 友達クラス | クラス | 囲む宣言のみ + 同じファイル内の宣言の拡張 |
fileprivate | - | - | - | 同じファイル |
file | 同じファイル | - | - | - |
private protected | 同じアセンブリ内の派生クラス | - | - | - |
protected internal | 同じアセンブリ および/または 派生クラス | - | - | - |
protected | 派生クラス | 派生クラス および/または フレンドクラス | 派生クラス および/または 同じパッケージ内 | - |
package | - | - | パッケージ内 | - |
internal | 同じアセンブリ | - | - | 同じモジュール |
public | みんな | みんな | みんな | みんな |
open | - | - | - | 全員 + モジュール外のサブクラス + モジュール外のオーバーライド |
例
C++
stdをインポートします。 // 構造体内のデフォルトのアクセス修飾子は public です// クラス内のデフォルトのアクセス修飾子は private ですstruct Base { private : int x ; protected : // Base::m、Base::n は protected int m ; int n ; public : void set_n ( int v ) noexcept { n = v ; } void f () { std :: println ( "Base::f() を呼び出しています" ); } }; // Derived はパブリック継承で Base を拡張しますstruct Derived : public Base { private : using Base :: f ; // Derived::f はプライベートですpublic : using Base :: m ; // Derived::m はパブリックです // Base::n はここからアクセス可能ですが、[[ nodiscard ]]の外側からはアクセスできませんint get_n () const noexcept { return n ; } // エラー、ここでは Base::x にアクセスできません// int get_x() const noexcept { // return x; // } }; int main ( int argc , char * argv []) {派生したd ; // dx = 2; // エラー、private // dn = 2; // エラー、protected d . m = 2 ; // protected Base::m は Derived::m としてアクセス可能です d . set_n ( 2 ); // Base::set_n(int) を呼び出すstd :: println ( "{}" , d . get_n ()); // 出力: 2 // df(); // エラー、Base::f は Derived::f としてアクセスできません Base & b = d ; // b は d を参照し、それを Base 型として「表示」します // bx = 3; // エラー、private // bn = 3; // エラー、protected // bm = 3; // エラー、Base::m は protected です b . set_n ( 3 ); // Base::set_n(int) を呼び出す// std::println("{}", b.get_n()); // エラー、'struct Base' には 'get_n' という名前のメンバーがありません b . f (); // Base::f() を呼び出し、 0を返します。} 参考文献
注記
- ^ メイヨー 2002年、199ページ。
- ^ Wagner, Bill . 「アクセス修飾子 - C#プログラミングガイド」. docs.microsoft.com . 2020年1月13日閲覧。
- ^ 「アクセス指定子」. en.cppreference.com . 2020年1月13日閲覧。
- ^ 「アクセス修飾子(C#リファレンス)」. learn.microsoft.com . Microsoft . 2022年9月27日. 2023年2月8日閲覧。
- ^ 「アクセス制御 — Swiftプログラミング言語(Swift 5.3)」. docs.swift.org . 2021年2月8日閲覧。
参考文献
- メイヨー、ジョセフ(2002年)、C Sharp Unleashed、サムズ出版、ISBN 9780672321221