C# カプセル化

カプセル化は「1つまたは複数の項目を物理的または論理的なパッケージに封じ込めること」と定義されます。オブジェクト指向プログラミングの方法論では、カプセル化は実装の詳細へのアクセスを防ぐためのものです。

抽象化とカプセル化は、オブジェクト指向プログラミングにおける関連する特性です。抽象化は関連情報を可視化できるようにし、カプセル化は開発者に必要なレベルの抽象化を実装させます。。

C# のカプセル化は、具体的なニーズに応じてユーザーのアクセス権限を設定し、アクセス修飾子を使用して実現します。

1つのアクセス修飾子は、クラスメンバーのスコープと可視性を定義します。C# がサポートするアクセス修飾子は次のとおりです:

  • public:すべてのオブジェクトからアクセスできます;
  • private:オブジェクト自体はオブジェクト内部でアクセスできます;
  • protected:そのクラスのオブジェクトとそのサブクラスのオブジェクトのみアクセスできます;
  • internal:同じアセンブリ内のオブジェクトからアクセスできます;
  • protected internal:アクセスは現在のアセンブリ、または包含クラスから派生した型に限定されます。

Public アクセス修飾子

Public アクセス修飾子を使用すると、クラスはそのメンバー変数とメンバー関数を他の関数やオブジェクトに公開できます。パブリックメンバーは外部のクラスからアクセスできます。

次の例はこれを示しています:

例

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        //メンバー変数
        public double length;
        public double width;

        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("長さ: {0}", length);
            Console.WriteLine("幅: {0}", width);
            Console.WriteLine("面積: {0}", GetArea());
        }
    }// Rectangle の終了

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 4.5;
            r.width = 3.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

长度: 4.5
宽度: 3.5
面积: 15.75

上記の例では、メンバー変数 length と width はpublicとして宣言されているため、関数 Main() は Rectangle クラスのインスタンスを使用してrアクセスできます。

メンバー関数Display()とGetArea()はこれらの変数に直接アクセスできます。

メンバー関数Display()もpublicとして宣言されているため、Main() もMain()Rectangle クラスのインスタンスを使用してrアクセスできます。

Private アクセス修飾子

Private アクセス修飾子を使用すると、クラスはそのメンバー変数とメンバー関数を他の関数やオブジェクトから隠すことができます。同じクラス内の関数のみがそのプライベートメンバーにアクセスできます。クラスのインスタンスであっても、そのプライベートメンバーにアクセスすることはできません。

次の例はこれを示しています:

例

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        // プライベートメンバー変数
        private double length;
        private double width;

        // ユーザー入力から長方形の長さと幅を取得するパブリックメソッド
        public void AcceptDetails()
        {
            Console.WriteLine("長さを入力してください:");
            length = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("幅を入力してください:");
            width = Convert.ToDouble(Console.ReadLine());
        }

        // 長方形の面積を計算するパブリックメソッド
        public double GetArea()
        {
            return length * width;
        }

        // 長方形のプロパティと面積を表示するパブリックメソッド
        public void Display()
        {
            Console.WriteLine("長さ: {0}", length);
            Console.WriteLine("幅: {0}", width);
            Console.WriteLine("面積: {0}", GetArea());
        }
    }//end class Rectangle    

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            // Rectangle クラスのインスタンスを作成
            Rectangle r = new Rectangle();

            // パブリックメソッド AcceptDetails() を使用して、ユーザー入力から長方形の長さと幅を取得
            r.AcceptDetails();

            // パブリックメソッド Display() を使用して、長方形のプロパティと面積を表示
            r.Display();

            Console.ReadLine();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

请输入长度:
5
请输入宽度:
3
长度: 5
宽度: 3
面积: 15

説明:

  • lengthとwidthはプライベートメンバー変数として宣言されており、クラスの外部から直接アクセスおよび変更されることを防ぎます。

  • AcceptDetailsメソッドは、ユーザーが長方形の長さと幅を入力できるようにします。これは、パブリックメソッドを通じてプライベート変数を操作する例です。

  • GetAreaメソッドは長方形の面積の計算に使用され、Displayメソッドは長方形のプロパティと面積の表示に使用されます。

  • にExecuteRectangleクラスでは、Rectangleクラスのインスタンスを作成し、そのパブリックメソッドを呼び出して操作を実行します。このようにして、メインプログラムは長方形の長さと幅に直接アクセスして変更することができず、クラスが提供するパブリックインターフェースを通じて操作を行い、カプセル化を実現しています。

Protected アクセス修飾子

Protected アクセス修飾子を使用すると、サブクラスは基底クラスのメンバー変数とメンバー関数にアクセスできます。これにより、継承の実装が容易になります。これについては継承の章で詳しく説明します。より詳しく説明します。

Internal アクセス修飾子

Internal アクセス修飾子を使用すると、クラスはそのメンバー変数とメンバー関数を現在のプログラム内の他の関数やオブジェクトに公開できます。言い換えれば、internal アクセス修飾子を持つメンバーは、そのメンバーが定義されているアプリケーション内の任意のクラスまたはメソッドからアクセスできます。

次の例はこれを示しています:

例

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        //メンバー変数
        internal double length;
        internal double width;
       
        double GetArea()
        {
            return length * width;
        }
       public void Display()
        {
            Console.WriteLine("長さ: {0}", length);
            Console.WriteLine("幅: {0}", width);
            Console.WriteLine("面積: {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();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

长度: 4.5
宽度: 3.5
面积: 15.75

上記の例では、メンバー関数GetArea()がアクセス修飾子なしで宣言されていることに注意してください。アクセス修飾子が指定されていない場合、クラスメンバーのデフォルトのアクセス修飾子、つまり private が使用されます。private。

Protected Internal アクセス修飾子

Protected Internal アクセス修飾子を使用すると、このクラス、派生クラス、またはこのクラスを含むアセンブリ内からアクセスできます。これも継承の実装に使用されます。

その他の拡張