Csharp-encapsulation

提供:Dev Guides
移動先:案内検索

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()_も public として宣言されているため、 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()_は public として宣言されているため、 Main )から r という名前のRectangleクラスのインスタンスを使用してアクセスできます。

保護されたアクセス指定子

保護されたアクセス指定子により、子クラスはその基本クラスのメンバー変数とメンバー関数にアクセスできます。 これにより、継承の実装に役立ちます。 これについては、継承の章で詳しく説明します。

内部アクセス指定子

内部アクセス指定子により、クラスはそのメンバー変数とメンバー関数を現在のアセンブリ内の他の関数とオブジェクトに公開できます。 つまり、内部アクセス指定子を持つメンバーは、そのメンバーが定義されているアプリケーション内で定義されているクラスまたはメソッドからアクセスできます。

次のプログラムはこれを示しています-

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()_がアクセス指定子で宣言されていないことに注意してください。 次に、何も言及しない場合、クラスメンバーのデフォルトのアクセス指定子は何になりますか?* private *です。

保護された内部アクセス指定子

保護された内部アクセス指定子を使用すると、クラスは、同じアプリケーション内の子クラスを除き、他のクラスオブジェクトおよび関数からそのメンバー変数とメンバー関数を隠すことができます。 これは、継承を実装するときにも使用されます。