導入
インターフェースは「このメソッドを持つ」という契約だけを定めた型です。実装は各クラスに任せ、「同じ契約を満たすなら差し替え可能」という柔軟な設計を可能にします。継承(is-a)と違い「〜できる(can-do)」を表します。
図解
flowchart TB
I["interface IPayment<br/>Pay(amount) の契約"] --> C["CreditCard : IPayment"]
I --> P["PayPay : IPayment"]
USE["支払い処理"] -->|IPayment として扱う| I
style I fill:#e1f5fe
サンプル
// IPayment 型として、実装クラスを差し替えて使える
IPayment payment = new CreditCard();
payment.Pay(1000); // クレジットカードで1000円支払い
payment = new PayPay();
payment.Pay(500); // PayPayで500円支払い
// interface: メソッドの「契約」だけを定義(中身は持たない)
interface IPayment
{
void Pay(int amount);
}
// : で「この契約を実装する」と宣言
class CreditCard : IPayment
{
public void Pay(int amount) => Console.WriteLine($"クレジットカードで{amount}円支払い");
}
class PayPay : IPayment
{
public void Pay(int amount) => Console.WriteLine($"PayPayで{amount}円支払い");
}
interfaceは「持つべきメソッド」の契約だけを定める(実装なし)- クラスは
class C : IXxxで契約を実装する(複数のインターフェースを実装可能) - インターフェース型の変数に、契約を満たす任意の実装を代入できる=差し替え可能
演習
INotifier notifier = new EmailNotifier();
notifier.Send("こんにちは");
// TODO: INotifier インターフェース(Send(string) の契約)を定義し、
// EmailNotifier で "メール送信: メッセージ" と出力する実装を作ってください
___
- 期待される出力:
メール送信: こんにちは
ヒント1を見る
interface INotifier { void Send(string message); }
ヒント2を見る
class EmailNotifier : INotifier { public void Send(string message) => Console.WriteLine($"メール送信: {message}"); }
まとめ
- インターフェースは「できること」の契約だけを定める
- クラスは契約を実装し、複数実装もできる
- 契約を満たす実装を自由に差し替えられる(疎結合な設計の土台)
次回: オブジェクトに属さない「static メンバー」です。