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

C#の実行時ポリモーフィズムとは?抽象クラスと仮想関数による実装を解説

実行時ポリモーフィズムの概要

実行時ポリモーフィズム(ランタイム・ポリモーフィズム)は、メソッドのオーバーライドによって実現される仕組みで、「動的バインディング(dynamic binding)」や「遅延バインディング(late binding)」とも呼ばれます。C#では、主に抽象クラス仮想関数(virtualメソッド)を用いて実装します。

抽象クラスによる実装

抽象クラスには「抽象メソッド」を定義でき、その具体的な処理は派生クラス側で実装することになります。これにより、実際に呼び出されるメソッドが実行時に決定される、柔軟な設計が可能になります。

以下は、抽象クラスを使って実行時ポリモーフィズムを実現するサンプルコードです。

コード例

using System;

namespace PolymorphismApplication {
    abstract class Shape {
        public abstract int area();
    }

    class Rectangle : Shape {
        private int length;
        private int width;

        public Rectangle(int a = 0, int b = 0) {
            length = a;
            width = b;
        }

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

    class RectangleTester {
        static void Main(string[] args) {
            Rectangle r = new Rectangle(10, 7);
            double a = r.area();
            Console.WriteLine("Area: {0}", a);
            Console.ReadKey();
        }
    }
}

出力結果

Rectangle class area :
Area: 70

この例では、基底クラス Shape の抽象メソッド area() を、派生クラス Rectangleoverride キーワードを使って上書きしています。呼び出し側は area() を呼ぶだけでよく、実際にどの実装が実行されるかは実行時に決まります。

仮想関数(virtualメソッド)による実装

基底クラスで定義したメソッドを、継承先のクラスごとに異なる処理として実装し直したい場合には、virtual キーワードを付けた仮想関数を使用します。

仮想関数は、継承した各クラスでそれぞれ異なる実装を持つことができ、プログラムの実行時にどのメソッドが呼び出されるかが決定されます。これにより、同じインターフェースを持ちながら、オブジェクトの実際の型に応じた振る舞いを実現できるのが大きな特徴です。

  1. C#の抽象クラス(abstract class)とは?基本から実例までわかりやすく解説

    抽象クラスとは C#における抽象クラス(abstract class)は、abstractキーワードを使って宣言される特殊なクラスです。抽象クラスには、実装を持たない「抽象メソッド」と、通常の処理を持つ「非抽象メソッド」の両方を含めることができます。 最大の特徴は、抽象クラスは直接インスタンス化できないという点です。newキーワードでオブジェクトを生成することはできず、必ず派生クラスを通じて利用します。この仕組みにより、「共通の設計図を基底クラスで定義し、具体的な実装は各派生クラスに任せる」というポリモーフィズム(多態性)を実現できます。 抽象クラスの基本的な宣言方法 以下は、抽象クラスVe

  2. Javaの抽象クラスとは?基本ルールと実装例をわかりやすく解説

    Javaの抽象クラスとは宣言に「abstract」キーワードを含むクラスは、抽象クラスと呼ばれます。抽象クラスは、継承によって利用されることを前提とした設計用のクラスであり、オブジェクト指向プログラミングにおける重要な概念の一つです。抽象クラスの主な特徴抽象クラスには、抽象メソッド(本体を持たないメソッド。例:public void get();)が含まれる場合もあれば、含まれない場合もあります。ただし、クラス内に1つでも抽象メソッドが存在する場合、そのクラスは必ず abstract として宣言しなければなりません。abstract として宣言されたクラスは、インスタンス化(newによるオブジ