「オブジェクト指向って大事らしいけど、結局どういうこと?」
「C#でクラスを書いているけど、これって本当にオブジェクト指向なの?」
そんな疑問を持ったことはありませんか。
私自身、最初は“なんとなく”クラスを作っていて、オブジェクト指向の本質を理解できていませんでした。
この記事では、まずオブジェクト指向の概念を整理し、そのうえで C# ではどう実装するのか を順番に見ていきます。
概念とコードがつながると、C#の設計が一段とクリアに見えるようになります。
1. オブジェクト指向とは何か
● 一言でいうと「現実世界の考え方をプログラムに持ち込む仕組み」
オブジェクト指向は難しく語られがちですが、本質はとてもシンプルです。
- 車には色がある
- 車は走る
- 車は止まる
こうした“モノの特徴や振る舞い”をそのままプログラムに落とし込む考え方がオブジェクト指向です。
● クラスとオブジェクトの関係
- クラス:設計図
- オブジェクト:設計図から作られた実体
「Car」というクラスを作れば、そこから「赤い車」「青い車」といったオブジェクトを生成できます。
● オブジェクト指向の3つの柱
オブジェクト指向を語るとき、必ず登場するのが次の3つです。
- カプセル化:内部状態を隠し、必要な操作だけ公開する
- 継承:共通部分をまとめて再利用する
- ポリモーフィズム:同じ操作でも、実体によって動作を変えられる
この3つを理解すると、コード設計の幅が一気に広がります。
2. C#でオブジェクト指向をどう実現するか
ここからは、上で説明した概念が C# ではどう書けるのか を具体的に見ていきます。
● クラスとオブジェクトの作成
public class Car
{
public string Color { get; set; }
public void Run()
{
Console.WriteLine("走っています");
}
}
var car = new Car { Color = "Red" };
car.Run();
C#ではクラスがオブジェクト指向の中心。
プロパティやメソッドを使って、モノの特徴や振る舞いを表現します。
● カプセル化:アクセス修飾子で「見せる/隠す」をコントロール
public class BankAccount
{
private int _balance;
public void Deposit(int amount)
{
_balance += amount;
}
public int GetBalance() => _balance;
}
private を使うことで、外部から勝手に _balance を変更されないようにできます。
C#ではアクセス修飾子がカプセル化の要です。
● 継承:共通部分をまとめる
public class Animal
{
public void Eat() => Console.WriteLine("食べています");
}
public class Dog : Animal
{
public void Bark() => Console.WriteLine("ワン!");
}
Dog は Animal を継承しているため、Eat() をそのまま利用できます。
ただし、C#では継承を多用しすぎると複雑化しやすいため、後述のインターフェースと使い分けることが重要です。
● ポリモーフィズム:同じ操作で違う動作をさせる
public abstract class Animal
{
public abstract void Speak();
}
public class Dog : Animal
{
public override void Speak() => Console.WriteLine("ワン!");
}
public class Cat : Animal
{
public override void Speak() => Console.WriteLine("ニャー!");
}
Animal animal = new Dog();
animal.Speak(); // ワン!
animal = new Cat();
animal.Speak(); // ニャー!
同じ Speak() でも、実体によって動作が変わる。
これがポリモーフィズムの魅力です。
● インターフェース:C#では“契約書”としてよく使う
public interface IWorker
{
void Work();
}
public class Programmer : IWorker
{
public void Work() => Console.WriteLine("コードを書いています");
}
C#では継承よりもインターフェースを使う文化が強いです。
依存性を減らし、テストしやすくなるため、実務でも頻繁に登場します。
3. C#ならではのオブジェクト指向ポイント
● プロパティ構文が強力
C#のプロパティは getter/setter を簡潔に書けるため、カプセル化と相性が良いです。
● インターフェース中心の設計が主流
DI(依存性注入)やテスト容易性の観点から、C#ではインターフェースが多用されます。
● C# の新機能もオブジェクト指向をさらに後押ししている
C# 8 以降では、オブジェクト指向の設計をより自然に表現できる機能が次々と追加されています。
- record 型:値オブジェクトを簡潔に表現できる
- init アクセサ:不変オブジェクトを安全に構築できる
- パターンマッチングの強化:条件分岐をより直感的に書ける
これらの機能によって、C# ではオブジェクト指向の考え方をコードへ落とし込みやすくなり、より意図が伝わる設計が実現しやすくなっています。
4. まとめ
- オブジェクト指向は「現実世界の考え方をコードに持ち込む」ための仕組み
- C#はその考え方を実現しやすい言語
- クラス、カプセル化、継承、ポリモーフィズム、インターフェースが基本
- 概念を理解してからコードを見ると、C#の設計が一段と理解しやすくなる
もし「オブジェクト指向って難しい」と感じているなら、まずは身近なモノをクラスにしてみるところから始めてみてください。
意外とスッと理解できる瞬間が訪れます。