C#の静的ポリモーフィズムとは?静的バインディングの仕組みと実装例をわかりやすく解説
静的ポリモーフィズム(Static Polymorphism)とは
静的ポリモーフィズムとは、関数とオブジェクトの結び付け(バインディング)がコンパイル時に行われる仕組みのことです。このため「静的バインディング(Static Binding)」とも呼ばれます。コンパイルの時点でどのメソッドが呼び出されるかが確定するため、実行時のオーバーヘッドが少なく、高いパフォーマンスを発揮できるのが特徴です。
C#では、静的ポリモーフィズムを実現する手法として、主に次の2つが用意されています。
- 関数(メソッド)のオーバーロード
- 演算子のオーバーロード
関数のオーバーロード(Function Overloading)
関数のオーバーロードとは、同じスコープ内で同じ名前の関数を複数定義できる機能のことです。ただし、それぞれの定義は、引数リストの「型」や「数」が互いに異なっている必要があります。戻り値の型だけが異なる関数宣言はオーバーロードできない点に注意してください。
サンプルコード
次の例では、print という同じ名前のメソッドを、int 型・double 型・string 型の引数に対応させて3つ定義しています。呼び出し時に渡す引数の型に応じて、コンパイラが適切なメソッドを自動的に選択します。
using System;
namespace PolymorphismApplication {
class Printdata {
void print(int i) {
Console.WriteLine("Printing int: {0}", i);
}
void print(double f) {
Console.WriteLine("Printing double: {0}", f);
}
void print(string s) {
Console.WriteLine("Printing string: {0}", s);
}
static void Main(string[] args) {
Printdata p = new Printdata();
// 整数を出力する print を呼び出し
p.print(5);
// 浮動小数点数を出力する print を呼び出し
p.print(500.263);
// 文字列を出力する print を呼び出し
p.print("Hello C#");
Console.ReadKey();
}
}
}実行結果
Printing int: 5 Printing double: 500.263 Printing string: Hello C#
演算子のオーバーロード(Operator Overloading)
もう一つの手法が演算子のオーバーロードです。これは、+ や - といった演算子の動作を、クラスや構造体などのユーザー定義型に合わせて再定義できる機能です。これにより、独自の型同士でも直感的な演算子の記述が可能になります。
静的ポリモーフィズムと動的ポリモーフィズムの違い
一方、メソッドとオブジェクトの結び付けが実行時に行われる場合は「動的ポリモーフィズム(Dynamic Polymorphism)」と呼ばれ、C#ではメソッドのオーバーライド(override)がこれに該当します。「オーバーロード=静的」「オーバーライド=動的」と覚えておくと理解しやすいでしょう。
-
C#の動的ポリモーフィズムとは?仕組みと実装例をわかりやすく解説
オブジェクト指向プログラミングにおけるポリモーフィズム(多態性)は、大きく分けて「静的(スタティック)」と「動的(ダイナミック)」の2種類があります。 静的ポリモーフィズム:関数呼び出しへの応答がコンパイル時に決定されます。メソッドのオーバーロードなどが代表例です。 動的ポリモーフィズム:関数呼び出しへの応答が実行時(ランタイム)に決定されます。 C#では、抽象クラスや基底クラスの仮想関数(virtualメソッド)と、それを派生クラスでオーバーライドする仕組みによって、動的ポリモーフィズムを実現します。これにより、同じインターフェースを持つ異なるオブジェクトに対して、実際の型に応じた適切な
-
Pythonのprint()関数とは?役割と基本的な使い方をわかりやすく解説
Python 3において、print()は組み込み関数の一つで、引数として渡された値を画面(標準出力)に表示するために使われます。プログラミング初心者が最初に学ぶ関数でもあり、デバッグや動作確認にも欠かせない存在です。print()関数の基本的な使い方>>> print("Hello!") Hello! >>> print(5) 5このように、文字列や数値など、さまざまな型のオブジェクトをそのまま渡すだけで出力できます。Python 2以前との違い:文から関数へ実は、Python 2以前ではprintは「関数」ではなく「ステートメント(文