C# - カプセル化
カプセル化 「物理的または論理的なパッケージ内に 1 つまたは複数のアイテムを封入するプロセス」として定義されます。オブジェクト指向プログラミング方法論におけるカプセル化により、実装の詳細へのアクセスが妨げられます。
抽象化とカプセル化は、オブジェクト指向プログラミングの関連機能です。抽象化により関連情報を可視化でき、カプセル化によりプログラマーは必要なレベルの抽象化を実装できます .
カプセル化は、アクセス指定子を使用して実装されます . アクセス指定子 クラス メンバーのスコープと可視性を定義します。 C# は次のアクセス指定子をサポートします −
- 公開
- 非公開
- 保護
- 社内
- 保護された内部
パブリック アクセス指定子
パブリック アクセス指定子を使用すると、クラスはそのメンバー変数とメンバー関数を他の関数やオブジェクトに公開できます。すべてのパブリック メンバーは、クラスの外部からアクセスできます。
次の例はこれを示しています-
ライブデモ
using System;
namespace RectangleApplication {
class Rectangle {
//member variables
public double length;
public double width;
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Length: 4.5 Width: 3.5 Area: 15.75
前の例では、メンバー変数の長さと幅が public として宣言されています。 であるため、r という名前の Rectangle クラスのインスタンスを使用して Main() 関数からアクセスできます。 .
メンバ関数 Display() および GetArea() クラスのインスタンスを使用せずにこれらの変数に直接アクセスすることもできます。
メンバ関数 Display() 公開も宣言されています であるため、Main() からもアクセスできます。 r という名前の Rectangle クラスのインスタンスを使用する .
プライベート アクセス指定子
プライベート アクセス指定子を使用すると、クラスはそのメンバー変数とメンバー関数を他の関数やオブジェクトから隠すことができます。同じクラスの関数のみがそのプライベート メンバーにアクセスできます。クラスのインスタンスでさえ、プライベート メンバーにアクセスできません。
次の例はこれを示しています-
ライブデモ
using System;
namespace RectangleApplication {
class Rectangle {
//member variables
private double length;
private double width;
public void Acceptdetails() {
Console.WriteLine("Enter Length: ");
length = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter Width: ");
width = Convert.ToDouble(Console.ReadLine());
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Enter Length: 4.4 Enter Width: 3.3 Length: 4.4 Width: 3.3 Area: 14.52
前の例では、メンバー変数の長さと幅が private として宣言されています。 であるため、関数 Main() からアクセスすることはできません。メンバー関数 AcceptDetails() および Display() これらの変数にアクセスできます。メンバー関数 AcceptDetails() から および Display() パブリックと宣言されています Main() からアクセスできます r という名前の Rectangle クラスのインスタンスを使用する .
保護されたアクセス指定子
Protected アクセス指定子を使用すると、子クラスはその基本クラスのメンバー変数とメンバー関数にアクセスできます。このようにして、継承の実装に役立ちます。これについては、継承の章で詳しく説明します。
内部アクセス指定子
内部アクセス指定子を使用すると、クラスはそのメンバー変数とメンバー関数を現在のアセンブリ内の他の関数とオブジェクトに公開できます。つまり、内部アクセス指定子を持つメンバーは、そのメンバーが定義されているアプリケーション内で定義されたクラスまたはメソッドからアクセスできます。
次のプログラムはこれを示しています −
ライブデモ
using System;
namespace RectangleApplication {
class Rectangle {
//member variables
internal double length;
internal double width;
double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Length: 4.5 Width: 3.5 Area: 15.75
前の例では、メンバー関数 GetArea() に注目してください。 アクセス指定子で宣言されていません。では、何も言及しない場合、クラス メンバーの既定のアクセス指定子は何でしょうか? 非公開です .
保護された内部アクセス指定子
protected internal アクセス指定子を使用すると、クラスは、同じアプリケーション内の子クラスを除いて、メンバー変数とメンバー関数を他のクラス オブジェクトと関数から隠すことができます。これは、継承を実装する際にも使用されます。
C言語