C# - 封筒化:初めての人向けのガイド

こんにちは、未来のコーディングスーパースター!今日、私たちはC#の世界に踏み込み、その基本概念の一つである「封筒化(Encapsulation)」を探求します。コードを一行も書いたことがない方也不用担心——私はあなたを一歩一歩ガイドします。それでは、始めましょう!

C# - Encapsulation

什么は封筒化?

本質的な部分に入る前に、まず封筒化とは何について理解しましょう。あなたが魔法の箱を持っていて、それが素晴らしいことをできるけれども、その内部がどのように動作しているかを知る必要はなく、ただそれを使う方法を知るだけで十分です。それが封筒化の核心です!

C#では、封筒化はデータ(変数)とそのデータを操作するメソッドを一つのユニットまたはオブジェクトにbundleすることです。コードの周りに保護的なカプセルを作成するようなものですから、名前が「封筒化(encapsulation)」なのです。

さて、C#が封筒化を実装する方法としてアクセス修飾子を探ってみましょう。

C#のアクセス修飾子

アクセス修飾子は、クラス、メソッド、プロパティのコード内でのアクセス可能性を定義するキーワードです。これを różne levels of security clearance( różneセキュリティクリアランスレベル)と考えます。C#は主に5つのアクセス修飾子を提供します:

  1. Public
  2. Private
  3. Protected
  4. Internal
  5. Protected Internal

それぞれを一つずつ見ていきましょう。

Public アクセス修飾子

publicキーワードは「どこでもアクセス可能」というパスのようなものです。メンバーをpublicとして宣言すると、プログラムのどこからでもアクセスできます。

public class Person
{
public string Name { get; set; }

public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name}!");
}
}

class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice";  // Publicプロパティにアクセス
person.SayHello();  // Publicメソッドを呼び出し
}
}

この例では、NameSayHello()はどちらもpublicなので、Mainメソッドから直接アクセスできます。

Private アクセス修飾子

privateは「スタッフ専用」エリアのようなものです。プライベートメンバーは同一クラス内でのみアクセスできます。

public class BankAccount
{
private double balance;

public void Deposit(double amount)
{
if (amount > 0)
{
balance += amount;
}
}

public double GetBalance()
{
return balance;
}
}

class Program
{
static void Main(string[] args)
{
BankAccount account = new BankAccount();
account.Deposit(100);
// account.balance = 1000000;  // これはエラーを引き起こします!
Console.WriteLine($"Balance: {account.GetBalance()}");
}
}

ここで、balanceはプライベートなので、BankAccountクラスの外部から直接アクセスすることはできません。代わりにpublicメソッドのDeposit()GetBalance()を使って操作します。

Protected アクセス修飾子

protectedメンバーは同一クラス内および派生クラスからアクセス可能です。これは「家族専用」セクションのようなものです。

public class Animal
{
protected string name;

public Animal(string name)
{
this.name = name;
}

protected void Eat()
{
Console.WriteLine($"{name} is eating.");
}
}

public class Dog : Animal
{
public Dog(string name) : base(name) { }

public void Bark()
{
Console.WriteLine($"{name} is barking!");  // Protectedメンバーにアクセス
Eat();  // Protectedメソッドを呼び出し
}
}

class Program
{
static void Main(string[] args)
{
Dog dog = new Dog("Buddy");
dog.Bark();
// dog.name = "Max";  // これはエラーを引き起こします!
// dog.Eat();  // これはもエラーを引き起こします!
}
}

この例では、Dogは親クラスAnimalのprotectedなnameEat()メソッドにアクセスできますが、Mainからは直接アクセスできません。

Internal アクセス修飾子

internalメンバーは同一アセンブリ(コンパイルされた.dllや.exeファイルを考えます)内でのみアクセス可能です。これは「会社の従業員専用」エリアのようなものです。

// AssemblyOne.cs内
internal class InternalClass
{
internal void InternalMethod()
{
Console.WriteLine("This is an internal method.");
}
}

// Program.cs内(同じアセンブリ)
class Program
{
static void Main(string[] args)
{
InternalClass obj = new InternalClass();
obj.InternalMethod();  // これは動作します!
}
}

// 別のアセンブリでは動作しません:
// InternalClass obj = new InternalClass();  // エラー!

Protected Internal アクセス修飾子

最後に、protected internalprotectedinternalの組み合わせです。同一アセンブリ内または他のアセンブリの派生クラスからアクセス可能です。

// AssemblyOne.cs内
public class BaseClass
{
protected internal void ProtectedInternalMethod()
{
Console.WriteLine("This is a protected internal method.");
}
}

// AssemblyTwo.cs内
public class DerivedClass : BaseClass
{
public void CallProtectedInternalMethod()
{
ProtectedInternalMethod();  // これは動作します!
}
}

// Program.cs内(AssemblyTwo)
class Program
{
static void Main(string[] args)
{
DerivedClass obj = new DerivedClass();
obj.CallProtectedInternalMethod();
// obj.ProtectedInternalMethod();  // これは動作しません!
}
}

アクセス修飾子のまとめ

以下にアクセスレベルをまとめた便利な表があります:

アクセス修飾子 同一クラス 派生クラス(同一アセンブリ) 非派生クラス(同一アセンブリ) 派生クラス(別のアセンブリ) 非派生クラス(別のアセンブリ)
Public はい はい はい はい はい
Private はい いいえ いいえ いいえ いいえ
Protected はい はい いいえ はい いいえ
Internal はい はい はい いいえ いいえ
Protected Internal はい はい はい はい いいえ

そして、ここまででC#の封筒化に関する初歩を踏み出しました。封筒化は、コードとデータへのアクセスを制御することで、より安全で保守が容易で柔軟なプログラムを書く手助けになります。

コーディングの旅を続ける中で、封筒化は自然と身につくものです。自転車に乗るのと同じで、最初は少し揺れましたが、すぐにスムーズに乗れるようになるでしょう!

継続して練習し、好奇心を持ち、ハッピーなコーディングを!

Credits: Image by storyset