C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のインターフェイスと継承とは?基本概念と実装例をわかりやすく解説

はじめに

C#におけるオブジェクト指向プログラミングの中核を担う機能のひとつが「インターフェイス」と「継承」です。この2つを正しく理解することで、再利用性が高く、保守しやすいコードを書けるようになります。本記事では、それぞれの基本的な考え方と、実際に動作するサンプルコードを交えて解説します。

インターフェイス(Interface)

インターフェイスとは、そのインターフェイスを実装するすべてのクラスが従うべき「構文上の契約(コントラクト)」として定義されるものです。インターフェイス自体は契約の「何をするか(What)」の部分だけを宣言し、「どのように実現するか(How)」の部分は、そのインターフェイスを実装する派生クラス側で定義します。

つまり、インターフェイスはメソッドのシグネチャ(名前・引数・戻り値の型)のみを持ち、具体的な処理内容は持たない設計図のような役割を果たします。これにより、異なるクラス間で共通の操作を保証しながら、実装の自由度を保つことができます。

インターフェイスの実装例

以下は、C#でインターフェイスを使用する具体例です。取引情報を扱うITransactionsインターフェイスを定義し、Transactionクラスがそれを実装しています。

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;

namespace InterfaceApplication {

    public interface ITransactions {
        // インターフェイスメンバー
        void showTransaction();
        double getAmount();
    }

    public class Transaction : ITransactions {
        private string tCode;
        private string date;
        private double amount;

        public Transaction() {
            tCode = " ";
            date = " ";
            amount = 0.0;
        }

        public Transaction(string c, string d, double a) {
            tCode = c;
            date = d;
            amount = a;
        }

        public double getAmount() {
            return amount;
        }

        public void showTransaction() {
            Console.WriteLine("Transaction: {0}", tCode);
            Console.WriteLine("Date: {0}", date);
            Console.WriteLine("Amount: {0}", getAmount());
        }
    }

    class Tester {

        static void Main(string[] args) {
            Transaction t1 = new Transaction("001", "8/10/2012", 78900.00);
            Transaction t2 = new Transaction("002", "9/10/2012", 451900.00);

            t1.showTransaction();
            t2.showTransaction();
            Console.ReadKey();
        }
    }
}

実行結果

Transaction: 001
Date: 8/10/2012
Amount: 78900
Transaction: 002
Date: 9/10/2012
Amount: 451900

この例では、TransactionクラスがITransactionsインターフェイスを実装することで、showTransaction()メソッドとgetAmount()メソッドの提供を保証しています。なお、インターフェイスのメンバーは暗黙的にpublicとして扱われるため、実装側でも必ずpublic修飾子を付けて宣言する必要があります。

継承(Inheritance)

継承を使うと、既存のクラスをもとにして新しいクラスを定義できます。これにより、アプリケーションの作成と保守が格段に容易になります。また、すでに書かれたコードの機能をそのまま再利用できるため、開発時間の大幅な短縮にもつながります。

継承の考え方は「IS-A関係」に基づいています。たとえば、「哺乳類は動物である(mammal IS A animal)」、「犬は哺乳類である(dog IS-A mammal)」、したがって「犬もまた動物である」というように、階層的な関係性を自然に表現できます。C#では、基底クラス(親クラス)から派生クラス(子クラス)を作ることで、この関係をコード上に反映します。

継承の実装例

次の例は、C#で継承を扱う方法を示しています。基底クラスShapeを継承して、派生クラスRectangleを定義しています。

using System;

namespace InheritanceApplication {
    class Shape {
        public void setWidth(int w) {
            width = w;
        }

        public void setHeight(int h) {
            height = h;
        }

        protected int width;
        protected int height;
    }

    // 派生クラス
    class Rectangle: Shape {
        public int getArea() {
            return (width * height);
        }
    }

    class RectangleTester {
        static void Main(string[] args) {
            Rectangle Rect = new Rectangle();

            Rect.setWidth(5);
            Rect.setHeight(7);

            // オブジェクトの面積を出力する
            Console.WriteLine("Total area: {0}", Rect.getArea());
            Console.ReadKey();
        }
    }
}

実行結果

Total area: 35

この例では、RectangleクラスはShapeクラスを継承しているため、親クラスのsetWidth()メソッドやsetHeight()メソッド、そしてprotectedフィールドであるwidthheightをそのまま利用できます。Rectangleクラス自身には面積計算用のgetArea()メソッドだけを追加すればよく、コードの重複を避けながら効率的に機能を拡張できています。

まとめ

インターフェイスは「何をするか」を定める契約であり、継承は既存クラスの機能を受け継いで拡張する仕組みです。両者を適切に使い分けることで、柔軟かつ保守性の高いオブジェクト指向設計を実現できます。まずは小さなサンプルを自分で書いて、それぞれの挙動を確認してみることをおすすめします。

  1. ネットワークのインターフェースとサービスとは?基本概念と種類をわかりやすく解説

    ネットワークサービスとは 一般的にネットワークサービスとは、アプリケーション層以上で動作し、コンピュータネットワーク上で利用されるアプリケーションのことを指します。 ネットワークサービスは、データの保存(ストレージ)、操作(処理)、提示(プレゼンテーション)、通信といった機能を提供します。実装方式としては、クライアント・サーバ型アーキテクチャ、またはピアツーピア(P2P)型アーキテクチャが採用されます。 サービスインターフェースとは サービスインターフェースは、SOA(Service-Oriented Architecture:サービス指向アーキテクチャ)を実現するための仕組みです。これによ

  2. Javaにおける継承とコンポジション(構成)の違い徹底解説

    Javaのオブジェクト指向設計において、「継承(Inheritance)」と「コンポジション(構成・Composition)」はどちらもコードの再利用性を実現する重要な手法です。しかし、その考え方や使い方には大きな違いがあります。コンポジションとは、あるクラスの中に別クラスのインスタンスをフィールドとして持たせる設計技法です。一方、継承とは、既存のクラスを拡張(extends)することで、親クラスのプロパティや動作を子クラスが引き継ぐ仕組みです。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。継承とコンポジションの違い一覧No.比較項目継承(Inheritance