カテゴリ: C# 更新日: 2026/07/17

C#のアダプタパターンとは?異なるインターフェースを統一する方法を初心者向けに解説

C#のアダプタパターンで異なるインターフェースを統一する方法
C#のアダプタパターンで異なるインターフェースを統一する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、C#でプログラムを作っているときに、形が違う部品同士をうまくつなげられなくて困っています。何か解決策はありますか?」

先生

「それは、アダプタパターンを使うことで解決できますよ。C#の設計パターンの中でも、とても役に立つ考え方です。」

生徒

「アダプタパターンですか?初めて聞く言葉ですが、具体的にはどのような仕組みなんですか?」

先生

「海外旅行で使う変換プラグをイメージしてください。それと同じことをプログラムで行うのがアダプタパターンです。順を追って解説しましょう。」

1. アダプタパターンとは?

1. アダプタパターンとは?
1. アダプタパターンとは?

アダプタパターンとは、互換性のないインターフェースを持つクラス同士を、連携できるようにするためのプログラミング上の設計手法です。インターフェースとは、クラスが外部とやり取りするためのルールや窓口のことです。例えば、新しいシステムを作っているときに、古いシステムで使われていた機能(クラス)をそのまま利用したいとします。しかし、新しいシステムのルール(インターフェース)に適合していない場合、そのままでは動かせません。そこで、間にアダプタ(変換器)となるクラスを挟み込むことで、古い機能に手を加えることなく、新しいシステムのルールに合わせて利用できるようにします。これにより、プログラムの再利用性が高まり、効率的な開発が可能になります。

2. なぜアダプタパターンが必要なのか?

2. なぜアダプタパターンが必要なのか?
2. なぜアダプタパターンが必要なのか?

プログラム開発において、すべてをゼロから新しく作ることは稀です。多くの場合、既存のコードや外部から提供されたライブラリを組み合わせてシステムを構築します。しかし、それらのコードは作成された時期や目的が異なるため、インターフェース(接続ルール)がバラバラなことが多いのです。ここでアダプタパターンを使わないと、既存コードをすべて書き直す必要が出てきます。これは莫大なコストがかかり、バグを生むリスクも高まります。アダプタパターンを利用すれば、既存のコードはそのままに、橋渡し役となるクラスを作成するだけで連携が可能になります。これにより、修正箇所を最小限に抑えつつ、柔軟なシステム構築ができるようになるのです。

3. 変換プラグで学ぶ概念の例え

3. 変換プラグで学ぶ概念の例え
3. 変換プラグで学ぶ概念の例え

海外旅行を想像してみてください。日本のコンセントの形状と、海外のコンセントの形状は違いますよね。そのままでは、日本の電化製品は海外で使えません。そこで、変換プラグ(アダプタ)を使います。変換プラグは、日本の電化製品の形状を海外のコンセントに合わせるという役割を担っています。これと同じことがプログラミングの世界でも起きています。日本のコンセントが「新しいシステムが求めるインターフェース」、海外の電化製品が「既存の機能」、変換プラグが「アダプタクラス」に相当します。アダプタクラスは、呼び出し側から受け取った要求を、既存機能が受け取れる形に変換して渡すという、中継機能を果たしているのです。

4. C#でインターフェースを作成する

4. C#でインターフェースを作成する
4. C#でインターフェースを作成する

では、実際にC#でコードを書いてみましょう。まずは、新しいシステムが期待しているルール(インターフェース)を定義します。インターフェースは、interfaceキーワードを使って作成します。これは、どのようなメソッドを持つべきかという「設計図」のようなものです。


public interface IPrinter
{
    void Print(string message);
}

上記の例では、IPrinterというインターフェースを作成しました。このインターフェースを使うすべてのクラスは、必ずPrintというメソッドを持つ必要がある、という約束をしています。interfaceは機能の実装を持たず、メソッドのシグネチャ(名前や引数)だけを定義するのが特徴です。

5. 既存の異なる機能を持つクラス

5. 既存の異なる機能を持つクラス
5. 既存の異なる機能を持つクラス

次に、古いシステムで使われていた、インターフェースが合わないクラスを作成します。このクラスは、Printというメソッドを持たず、代わりにOutputDataというメソッドを持っています。このままでは先ほどのIPrinterとして利用できません。


public class OldPrinter
{
    public void OutputData(string data)
    {
        Console.WriteLine("古いプリンターで出力: " + data);
    }
}

このOldPrinterクラスは便利な機能を持っていますが、IPrinterインターフェースに従っていません。ここで、アダプタの出番です。

6. アダプタクラスを実装して統一する

6. アダプタクラスを実装して統一する
6. アダプタクラスを実装して統一する

いよいよ、OldPrinterIPrinterとして使えるようにするアダプタクラスを作成します。このアダプタクラスはIPrinterを継承し、内部でOldPrinterを呼び出すようにします。


public class PrinterAdapter : IPrinter
{
    private readonly OldPrinter _oldPrinter = new OldPrinter();

    public void Print(string message)
    {
        // ここでメソッド名を変換して既存クラスを呼び出す
        _oldPrinter.OutputData(message);
    }
}

このPrinterAdapterは、IPrinterのルールを守りつつ、内部では古いOldPrinterOutputDataを呼び出すことで、目的を達成しています。これにより、利用者側はIPrinterというルールで統一して扱うことができます。最後に、これらを使って実行するコードを見てみましょう。


class Program
{
    static void Main()
    {
        IPrinter printer = new PrinterAdapter();
        printer.Print("こんにちは、アダプタパターンです!");
    }
}

このコードの実行結果は、以下のようになります。


古いプリンターで出力: こんにちは、アダプタパターンです!

このように、アダプタを使うことで、異なるインターフェースを持つクラスを統一した仕組みで利用できるようになりました。

カテゴリの一覧へ
新着記事
New1
C#
C#のDictionary(辞書)の使い方を初心者向けに完全解説!キーと値でデータ管理を学ぼう
New2
C#
C#の数値型をマスターしよう!int・double・decimalの違いと使い方
New3
C#
C#で始めるIoT開発!音声認識とスピーカー制御の仕組みを解説
New4
Azure
Azure Reposの使い方を徹底解説!Gitによるソースコード管理とブランチ戦略(Gitflow)
人気記事
No.1
Java&Spring記事人気No1
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.4
Java&Spring記事人気No4
Azure
Azureストレージの冗長性比較!LRS/GRS/ZRSの選び方とコストの最適解を完全解説
No.5
Java&Spring記事人気No5
C#
C#のログ出力入門!SerilogとNLogの使い方を徹底解説
No.6
Java&Spring記事人気No6
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本
No.8
Java&Spring記事人気No8
COBOL
COBOLの小数点の扱いと符号付きデータ型(S, V)の使い方を初心者向けに解説!