C#のオーバーロードとは?関数と演算子のオーバーロードをわかりやすく解説
はじめに
C#におけるオーバーロード(Overload)とは、同じ名前の機能を複数定義できる仕組みのことです。C#のオーバーロードには大きく分けて「関数(メソッド)のオーバーロード」と「演算子のオーバーロード」の2種類があります。オーバーロードを適切に活用することで、コードの可読性や再利用性が向上し、直感的で扱いやすいプログラムを書けるようになります。
関数(メソッド)のオーバーロード
同一スコープ内であれば、同じ名前の関数を複数定義することができます。ただし、各定義は引数リストにおいて、引数の型または数が互いに異なっている必要があります。戻り値の型だけが異なる定義はオーバーロードとして認識されないため、注意が必要です。
以下は、mulDisplay メソッドを引数の数を変えてオーバーロードした例です。
public static int mulDisplay(int one, int two) { }
public static int mulDisplay(int one, int two, int three) { }
public static int mulDisplay(int one, int two, int three, int four) { }このように定義しておくと、呼び出し側で渡す引数の数に応じて、コンパイラが自動的に最適なメソッドを選択してくれます。
演算子のオーバーロード
オーバーロードされた演算子は、特別な名前を持つ関数です。「operator」キーワードの後に、定義したい演算子の記号を続けて記述します。これにより、自分で作成したクラス(ユーザー定義型)に対しても、「+」や「-」といった演算子を使った自然な操作が可能になります。
以下は、Box クラスに対して「+」演算子をオーバーロードする例です。
public static Box operator+ (Box b, Box c) {
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}この例では、2つの Box オブジェクトを「+」で加算すると、それぞれの length・breadth・height が合算された新しい Box オブジェクトが返されます。
演算子オーバーロードの注意点
- 演算子のオペランドのうち、少なくとも1つはその演算子を定義しているクラス(または構造体)である必要があります。
- =(代入演算子)、&&、|| など、一部の演算子はオーバーロードできません。
- 等価演算子(==)をオーバーロードする場合は、!= も必ずセットで定義する必要があります。
まとめ
C#のオーバーロードには「関数のオーバーロード」と「演算子のオーバーロード」の2種類があります。関数のオーバーロードでは、引数の型や数を変えることで同名のメソッドを複数定義でき、演算子のオーバーロードでは、operator キーワードを使って自作クラスに演算子の動作を定義できます。両者を上手に使いこなすことで、より読みやすく直感的なコードを実現しましょう。
-
Javaのメソッドオーバーロードと型昇格(型プロモーション)の基礎を徹底解説
はじめにJavaでは、メソッドのオーバーロード(Overload)を利用することで、同じ名前のメソッドを複数定義し、異なる型や個数の引数に対して似たような処理を実行できます。さらに、引数の変数が互いに似た型である場合には、型昇格(Type Promotion)という仕組みが自動的に働きます。本記事では、これら2つの概念の関係性と、実際のコード例を通じてその動作を詳しく見ていきます。型昇格(Type Promotion)とは?型昇格とは、より小さい範囲の値を持つデータ型が、より大きい範囲のデータ型へ自動的に変換される仕組みです。たとえば、byte型の変数はint型の変数にそのまま代入できます。こ
-
Javaにおけるメソッドのオーバーロード(静的ポリモーフィズム)の基本と実装例
メソッドのオーバーロードは、静的ポリモーフィズム(静的多態性)の一種です。Javaでは、同じ名前を持つ複数のメソッドを、引数の数や型が異なる形で定義することができます。これにより、呼び出し側は同じメソッド名を使いながら、渡す引数に応じて適切な処理が自動的に選択されます。以下に、実際のサンプルプログラムを示します。サンプルコードpublic class Tester { public static void main(String args[]) { Tester tester = new Tester(); System.out.println(test