リスコフの置換原則とは


 

リスコフの置換原則(Liskov Substitution Principle, LSP)は、オブジェクト指向設計の基本原則の一つです。

C#で実際にクラスを設計する場合、どのように応用するかを具体例で見てみましょう。


1. LSPの原則とは

「サブクラス(派生クラス)は、スーパークラス(基底クラス)の代わりに使えるように設計すべき」

つまり、基底クラスを期待して書いたコードが、サブクラスでも問題なく動作する設計であることが重要です。


2. LSPに反した設計例(C#)

public class Bird { public virtual void Fly() { Console.WriteLine("飛びます"); } } public class Sparrow : Bird { // 問題なし } public class Penguin : Bird { // LSP違反 public override void Fly() { throw new NotImplementedException("ペンギンは飛べません!"); } }

この設計では、Bird 型の変数で Penguin を扱おうとすると、実行時に例外が発生します。

Bird myBird = new Penguin(); myBird.Fly(); // NotImplementedException

3. LSPに従った設計例(C#)

public class Bird { public virtual void Eat() { Console.WriteLine("食べます"); } } public class FlyingBird : Bird { public virtual void Fly() { Console.WriteLine("飛びます"); } } public class Sparrow : FlyingBird { // 問題なし } public class Penguin : Bird { // ペンギンは飛ばないので Fly メソッドは持たない }

こうすることで、Bird 型の変数として扱っても 飛べないペンギンでもエラーが起きない 設計になります。

Bird myBird1 = new Sparrow(); myBird1.Eat(); Bird myBird2 = new Penguin(); myBird2.Eat(); // 安全に動作

4. 実務での応用例

UIコンポーネント

public abstract class Widget { public abstract void Draw(); } public class Button : Widget { public override void Draw() { Console.WriteLine("ボタン描画"); } } public class TextBox : Widget { public override void Draw() { Console.WriteLine("テキストボックス描画"); } }
  • Widget 型で扱っても、ボタンやテキストボックスは正しく描画されます。

決済システム

public abstract class PaymentMethod { public abstract void Pay(decimal amount); } public class CreditCard : PaymentMethod { public override void Pay(decimal amount) { Console.WriteLine($"{amount}をカードで支払いました"); } } public class BankTransfer : PaymentMethod { public override void Pay(decimal amount) { Console.WriteLine($"{amount}を銀行振込で支払いました"); } }
  • どの支払い方法でも PaymentMethod 型で扱えるため、拡張が容易です。


5. まとめ

  • LSPを守ると安全に継承できる

  • サブクラスは基底クラスの契約(期待される動作)を壊してはいけない

  • C#では abstract クラスや virtual/override を上手く使い、サブクラスが安全に置換できるよう設計する

リスコフの置換原則を意識することで、変更に強く、保守性の高いオブジェクト指向設計を作ることができます。

コメント

このブログの人気の投稿

WPF経験者が挑戦!.NET MAUIで初スマホアプリ「写時くん」を公開してみた

洋上風力発電の今:三菱商事のゼロベース見直しが示す未来

SSHなしでLet's Encryptの証明書を使って共有サーバーをHTTPS化する方法【完全ガイド】