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

C#の動的ポリモーフィズムとは?仕組みと実装例をわかりやすく解説

オブジェクト指向プログラミングにおけるポリモーフィズム(多態性)は、大きく分けて「静的(スタティック)」と「動的(ダイナミック)」の2種類があります。

  • 静的ポリモーフィズム:関数呼び出しへの応答がコンパイル時に決定されます。メソッドのオーバーロードなどが代表例です。
  • 動的ポリモーフィズム:関数呼び出しへの応答が実行時(ランタイム)に決定されます。

C#では、抽象クラスや基底クラスの仮想関数(virtualメソッド)と、それを派生クラスでオーバーライドする仕組みによって、動的ポリモーフィズムを実現します。これにより、同じインターフェースを持つ異なるオブジェクトに対して、実際の型に応じた適切な処理を実行時に選択できるようになります。

動的ポリモーフィズムのサンプルコード

以下は、C#で動的ポリモーフィズムを実装した具体例です。基底クラス Shape の仮想メソッド area() を、派生クラスである Rectangle(長方形)と Triangle(三角形)がそれぞれオーバーライドしています。

using System;

namespace PolymorphismApplication {
    class Shape {
        protected int width, height;

        public Shape( int a = 0, int b = 0) {
            width = a;
            height = b;
        }

        public virtual int area() {
            Console.WriteLine("Parent class area :");
            return 0;
        }
    }

    class Rectangle: Shape {
        public Rectangle( int a = 0, int b = 0): base(a, b) {}

        public override int area () {
            Console.WriteLine("Rectangle class area :");
            return (width * height);
        }
    }

    class Triangle: Shape {
        public Triangle(int a = 0, int b = 0): base(a, b) {}
        public override int area() {
            Console.WriteLine("Triangle class area :");
            return (width * height / 2);
        }
    }

    class Caller {
        public void CallArea(Shape sh) {
            int a;
            a = sh.area();
            Console.WriteLine("Area: {0}", a);
        }
    }

    class Tester {
        static void Main(string[] args) {
            Caller c = new Caller();
            Rectangle r = new Rectangle(10, 7);
            Triangle t = new Triangle(10, 5);

            c.CallArea(r);
            c.CallArea(t);
            Console.ReadKey();
        }
    }
}

実行結果

Rectangle class area :
Area: 70
Triangle class area :
Area: 25

コードの解説

1. 基底クラスでの仮想メソッド定義

Shape クラスの area() メソッドには virtual キーワードが付いています。これにより、派生クラス側でこのメソッドの挙動を上書き(オーバーライド)できるようになります。

2. 派生クラスでのオーバーライド

Rectangle クラスと Triangle クラスは、それぞれ override キーワードを使って area() を再定義しています。長方形は「幅 × 高さ」、三角形は「幅 × 高さ ÷ 2」という、各図形に応じた面積計算を行います。

3. 実行時に呼び出されるメソッドが決まる

ポイントは Caller クラスの CallArea(Shape sh) メソッドです。引数は基底クラス型の Shape として受け取っていますが、実際に渡されるのは Rectangle オブジェクトや Triangle オブジェクトです。sh.area() を呼び出した瞬間に、実行時に渡されたオブジェクトの実際の型が判定され、対応するオーバーライドされたメソッドが呼び出されます。

そのため、同じ CallArea メソッドを呼んでいるにもかかわらず、長方形の場合は「70」、三角形の場合は「25」というように、オブジェクトごとに異なる結果が出力されるのです。これこそが動的ポリモーフィズムの本質であり、コードの柔軟性・拡張性を高める重要な仕組みといえます。

  1. 動的IPアドレスとは?仕組み・メリット・デメリットをわかりやすく解説

    動的IPアドレスとは動的IPアドレス(ダイナミックIPアドレス)とは、スマートフォン、デスクトップPC、ワイヤレスタブレットなど、ネットワークに接続する各機器(ノード)に対して自動的に割り当てられるIPアドレスのことです。この自動割り当ては、「DHCPサーバー」と呼ばれる仕組みによって実現されています。DHCPサーバーが割り当てたIPアドレスが「動的(ダイナミック)」と呼ばれる理由は、次回以降ネットワークに接続する際に、前回とは異なるIPアドレスが割り当てられることが多いからです。動的IPアドレスの対義語にあたるのが「静的IPアドレス(スタティックIPアドレス)」です。こちらは手動で設定された

  2. Windows 10の動的更新(Dynamic Update)とは?仕組みと設定方法をわかりやすく解説

    Windowsのアップデートを後回しにしているうちに、気づけば大型の機能更新プログラムが迫っている——そんな経験はありませんか。「インストールにどれくらい時間がかかるのか」「何度も再起動を繰り返すのでは」と不安になる方も多いはず。そこで役立つのが、Windows 10の「動的更新(Dynamic Update)」です。 Windows 10における動的更新とは 動的更新とは、Windows 10に搭載されたオプション機能で、機能更新プログラムのインストール時に必要な最新の更新コンテンツを自動的に取得し、まとめて適用できる仕組みのことです。これにより、インストール後に個別の更新を何度も繰り返し適