C#のアーリーバインディング(早期バインディング)とは?仕組みとオーバーロードの実装例を解説
アーリーバインディングとは
コンパイル時に関数とオブジェクトを結び付ける仕組みをアーリーバインディング(Early Binding/早期バインディング)と呼びます。スタティックバインディング(Static Binding/静的バインディング)という名称でも知られています。
C#では、この静的バインディングによって静的ポリモーフィズム(静的多態性)を実現するための手法として、次の2つが用意されています。
- 関数のオーバーロード(Function Overloading)
- 演算子のオーバーロード(Operator Overloading)
関数のオーバーロードとは
関数のオーバーロードとは、同じスコープ内であれば、同じ名前の関数を複数定義できる機能のことです。ただし、各関数の定義は、引数リストにおける引数の型または数が互いに異なっている必要があります。
注意:戻り値の型だけが異なる関数宣言はオーバーロードできません。そのような定義を行うとコンパイルエラーとなるため、注意が必要です。
サンプルコード
以下に、関数のオーバーロードを使用した完全なサンプルコードを示します。
using System;
namespace PolymorphismApplication {
class Printdata {
void print(int i) {
Console.WriteLine("Printing int: {0}", i);
}
void print(double f) {
Console.WriteLine("Printing float: {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 float: 500.263 Printing string: Hello C#
コードの解説
この例では、Printdataクラスの中に同名のprintメソッドを3つ定義しています。それぞれ引数の型がint・double・stringと異なるため、正しくオーバーロードされている状態です。
Mainメソッドからp.print(5)、p.print(500.263)、p.print("Hello C#")と呼び出すと、コンパイラが渡された引数の型を判定し、対応するメソッドへ自動的に振り分けます。このように、どの関数が呼ばれるかがコンパイルの時点で決定されることが、アーリーバインディングの大きな特徴です。
まとめ
アーリーバインディングは、実行時ではなくコンパイル時にメソッドの呼び出しが確定するため、動作が高速であるうえ、型の不一致などのミスもコンパイル段階で検出できます。C#で静的ポリモーフィズムを実現したい場合は、関数のオーバーロードや演算子のオーバーロードをぜひ活用してみてください。
-
Pythonのラムダバインディングとは?仕組みとデフォルト引数の使い方を解説
ラムダバインディングとはプログラムや関数のステートメントが実行されると、仮引数(formal parameters)の現在の値はスタック上に保存されます。そして、そのステートメントのスコープ内では、仮引数は呼び出し時に渡された実引数(actual arguments)の値へと束縛(バインド)されます。ステートメントを抜ける際には、保存しておいた元の値が復元されます。このプロトコルは完全に再帰的です。つまり、関数本体の中で仮引数が新しい値に再束縛されるような処理が行われても、ラムダバインディングの仕組みによって、すべてが秩序正しく処理されることが保証されています。変数xへの束縛は1つだけここで重
-
Pythonのprint()関数とは?役割と基本的な使い方をわかりやすく解説
Python 3において、print()は組み込み関数の一つで、引数として渡された値を画面(標準出力)に表示するために使われます。プログラミング初心者が最初に学ぶ関数でもあり、デバッグや動作確認にも欠かせない存在です。print()関数の基本的な使い方>>> print("Hello!") Hello! >>> print(5) 5このように、文字列や数値など、さまざまな型のオブジェクトをそのまま渡すだけで出力できます。Python 2以前との違い:文から関数へ実は、Python 2以前ではprintは「関数」ではなく「ステートメント(文