はじめに
自己学習でC#を使ったアプリを作成した際に、
オブジェクト指向への理解が足りていないと感じたため
オブジェクト指向についてまとめます。
初心者向けの記事となっていますのでこれから始める方の参考になったら幸いです。
C#とは
C#は、Microsoftによって開発されたオブジェクト指向プログラミング言語で、
.NET Core上で動作します。2000年に初めてリリースされ、JavaやC++に影響を受けた構文を持ち、強い型付けと安全性を特徴としています。
開発環境
OS:Windows11
IDE(統合開発環境):Visual Studio 2022
フレームワーク:.Net 8.0
オブジェクト指向
オブジェクト指向とは、
「モノ(オブジェクト)ごとに、データとその動作をまとめて扱う考え方」です。
これにより、
- プログラミングが管理しやすい
- プログラムを再利用しやすい
 といった利点があります。
C#では、この考え方を「クラス」と「オブジェクト」で表現します。
- クラス:設計図
- オブジェクト:設計図から作られた実体(インスタンス)
class Person {
    public string Name;
    public void SayHello() {
        Console.WriteLine($"こんにちは、{Name}です。");
    }
}
// インスタンス化
var p = new Person();
p.Name = "たろう";
p.SayHello(); // => こんにちは、たろうです。
クラスを使うことで、状態(データ)と動作(メソッド)を1つの単位で扱えます。
1.カプセル化(Encapsulation)
カプセル化は、「オブジェクトの内部情報を隠す」仕組みのことです。
外部から直接アクセスを制限してデータの安全性を確保し、
コードの保守性や再利用性を向上させる効果があります。
 class Account {
    private int balance; // 外部から直接変更できない
    public int Balance {
        get { return balance; }
        private set { balance = value; }
    }
    public void Deposit(int amount) {
        if (amount > 0) Balance += amount;
    }
}
外から書き換えられないようにするだけでなく、
意図しない使い方を防ぐ設計がカプセル化をする目的です。
- アクセス修飾子の種類
 今回使ったアクセス修飾子は、privateとpublicがほとんどでしたが、
 使ったものも含め、参考までに他の修飾子も紹介します。
| 名前 | 説明 | 
|---|---|
| public | 全てのクラスからアクセス可能 | 
| private | 自分のクラス以外からはアクセス不可能 | 
| protected | 自分のクラスからまたは派生クラスからアクセス可能 | 
| internal | 同じアセンブリ(プロジェクト)内のコードからのみアクセス可能 | 
2. 継承(Inheritance)
継承はすでにあるクラスを引き継いで新しいクラスを作成することです。
継承を使うと、共通の性質を持つクラスを親クラスにまとめて再利用できるため
プログラムの量を減らすことが出来ます。
ベースとなっているクラスを基底クラス(スーパークラス)と言い、
基底クラスを受け継いだクラスを派生クラスといいます。
// 基底クラス
    class Animal {
    public string Name;             
    public virtual void Speak() {
        Console.WriteLine("・・・");
    }
}
//派生クラス
class Dog : Animal { 
    public override void Speak() {
        Console.WriteLine("ワン!");
    }
}
virtualとoverrideを使うことで、
同じメソッド名でも派生クラスごとに動作を変えることができます。
これが後で出てくる「ポリモーフィズム」にもつながります。
3.ポリモーフィズム(Polymorphism)
ポリモーフィズム(多態性)とは、
同じメソッド名でも実行時の型に応じて動作が変わる性質です。
List<Animal> animals = new List<Animal> {
    new Dog(),
    new Cat()
};
foreach (var a in animals) {
    a.Speak(); // Dogなら「ワン!」、Catなら「ニャー!」
}
これにより「共通のインターフェースを通して、異なる型を同じように扱う」
ことができます。
4.interfaceとabstractの違い
| 比較項目 | interface | abstract class | 
|---|---|---|
| 実装を持てるか | ✕(C# 8.0以降は一部OK) | ○ | 
| 多重継承できるか | ○ | ✕ | 
| 用途 | ※1 | ※2 | 
※1 複数のクラスが共通で実装すべき機能の仕様を定義する
※2 クラス階層における共通の実装ロジックと仕様を統合する
例:
interface IWalkable {
    void Walk();
}
abstract class Animal {
    public abstract void Speak();
}
- interface → 「この動作ができる」ことを保証
- abstract class → 「共通の基礎実装をまとめる」
終わりに
今回はC#のオブジェクト指向についてですが他のプログラミング言語でも
オブジェクト指向が採用されているものもあります。
そのため、これからオブジェクト指向を学ぶ方の助けになれば嬉しいです。
