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

C#の仮想関数(virtualメソッド)とは?基本と使い方を実例付きで解説


仮想関数(virtualメソッド)とは

C#のvirtualキーワードは、メソッド、プロパティ、インデクサー、イベントを修飾するために使用されます。基底クラスで定義した関数を、それを継承する派生クラスで独自に実装し直したい場合に、その関数を「仮想関数」として宣言します。

仮想関数は、継承先のクラスごとに異なる実装を持つことができ、実際にどの実装が呼び出されるかは実行時に決定されます。この仕組みによって、オブジェクト指向プログラミングにおける重要な概念であるポリモーフィズム(多態性)が実現されます。

仮想関数の宣言方法

仮想関数は、メソッドの戻り値の型の前に「virtual」キーワードを付けるだけで宣言できます。

public virtual int area() { }

仮想関数の使用例

以下のサンプルコードでは、基底クラス「Shape」で仮想関数area()を定義し、派生クラス「Rectangle」と「Triangle」でそれぞれoverrideキーワードを使ってオーバーライドしています。

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("親クラスの面積計算");
            return 0;
        }
    }

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

        }

        public override int area() {
            Console.WriteLine("Rectangleクラスの面積");
            return (width * height);
        }
    }

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

        }

        public override int area() {
            Console.WriteLine("Triangleクラスの面積");
            return (width * height / 2);
        }
    }

    class Caller {
        public void CallArea(Shape sh) {
            int a;
            a = sh.area();
            Console.WriteLine("面積: {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クラスの面積
面積: 70
Triangleクラスの面積
面積: 25

コードのポイント

  • virtual:基底クラスのShapeクラスでarea()メソッドを仮想関数として宣言しています。
  • override:派生クラスのRectangleとTriangleで、それぞれ独自の面積計算ロジックを実装してオーバーライドしています。
  • 実行時の決定:CallerクラスのCallArea()メソッドは引数としてShape型を受け取りますが、実際に渡されるオブジェクトがRectangleかTriangleかに応じて、実行時に適切なarea()が自動的に呼び出されます。

このように、同じShape型の変数や引数を通じてメソッドを呼び出しても、オブジェクトの実際の型に応じた処理が自動的に選択されるのが、仮想関数とポリモーフィズムの大きな利点です。共通のインターフェースを保ちながら、クラスごとに異なる振る舞いを実現できるため、拡張性と保守性の高いコードを書くことができます。

  1. JavaScriptのコールバック関数とは?基本の仕組みと使い方を実例で解説

    JavaScriptにおいて、コールバック関数(callback function)とは、別の関数に引数として渡される関数のことです。引数として受け取った側の関数は、必要なタイミングでその関数を「呼び戻す(call back)」ため、この名前が付けられています。JavaScriptでは処理が上から順に実行されますが、時間のかかる処理(タイマー、通信など)を待っている間に他の処理を進めたい場合があります。こうした非同期処理を実現する基本的な手法が、コールバック関数です。コールバック関数の基本例以下のコードは、setTimeoutを使って5秒後にコールバック関数を呼び出すシンプルな例です。実際にブ

  2. JavaScriptの部分関数(Partial Function)とは?仕組みと実装例をわかりやすく解説

    部分関数(Partial Function)とは、既存の関数を引数として受け取り、それに加えて別の型の引数も同時に受け取れるようにする仕組みです。まず渡された引数の一部を使い、残りの引数を受け取る新しい関数を返します。そして、返された関数が呼び出されるときに、あらかじめ固定しておいた引数とそのときに渡された引数をすべて組み合わせて、元の親関数が実行されます。 この手法は「部分適用(Partial Application)」とも呼ばれ、関数型プログラミングの基本的なテクニックのひとつです。共通する引数を先に束縛しておくことで、処理の再利用性やコードの可読性を高めることができます。 コード例 以下