C#のメソッドオーバーロードと呼び出しの曖昧性について解説
C#におけるメソッドのオーバーロード(オーバーローディング)とは、同じスコープ内で同名のメソッドを複数定義できる機能です。ただし、それぞれの定義は、引数リストにおける引数の型や引数の数が互いに異なっている必要があります。
ここで注意したいのが、省略可能な引数(デフォルト引数)との組み合わせです。デフォルト値を持つ引数が含まれると、どのメソッドが呼び出されるべきか判断できなくなり、コンパイルエラー(あいまいな呼び出し)が発生する場合があります。
オーバーロードの基本例
まず、正常に動作する基本的な例を見てみましょう。次のコードでは、引数を1つ指定して呼び出しているため、パラメータが1つのメソッドが実行されます。
using System;
class Student {
static void DisplayMarks(int marks1 = 90) {
Console.WriteLine("Method with one parameter!");
}
static void DisplayMarks(int marks1, int marks2 = 95) {
Console.WriteLine("Method with two parameters!");
}
static void Main() {
DisplayMarks(97);
}
}
このコードを実行すると、コンソールには「Method with one parameter!」と表示されます。引数が1つだけ渡されているため、最初のメソッドが選択されるのです。
あいまいな呼び出しが発生するケース
次に、あいまいさ(ambiguity)が生じる例を見てみましょう。問題となるのは、両方のメソッドがデフォルト引数を持っている点です。1つ目のメソッドは引数2つに対してデフォルト値が必要であり、2つ目のメソッドも同様にデフォルト値を必要とします。この状態で引数を1つだけ渡して呼び出すと、コンパイラはどちらのメソッドを選べばよいか判断できず、エラーとなります。
using System;
class Student {
static void DisplayMarks(int marks1 = 90, int marks2 = 80) {
Console.WriteLine("Method with two parameters!");
}
static void DisplayMarks(int marks1, int marks2 = 80, int marks3 = 98) {
Console.WriteLine("Method with three parameters!");
}
static void Main() {
DisplayMarks(80);
}
}
Main()内の DisplayMarks(80) という呼び出しは、どちらのメソッドにも該当する可能性があるため、コンパイラは「呼び出しがあいまいです」というエラーを報告します。
曖昧性を避けるためのポイント
- オーバーロードされたメソッド同士で、デフォルト引数の構成が重複しないように設計する。
- 引数の型を変えるなど、呼び出し時に一意に判別できるシグネチャにする。
- デフォルト引数を使う場合は、オーバーロードの数を最小限に抑える。
このように、メソッドオーバーロードは便利な機能である一方、デフォルト引数との組み合わせによって意図しない曖昧性を生むことがあります。設計段階でシグネチャの一意性を意識することが重要です。
-
JavaScriptで関数を「関数」として呼び出す方法と「メソッド」として呼び出す方法の違い
JavaScriptでは、同じ関数でも呼び出し方によって「関数としての呼び出し」と「メソッドとしての呼び出し」という2つの使い方ができます。この2つの大きな違いは、関数内でthisが何を参照するかという点にあります。 2つの呼び出し方の違い 関数としての呼び出し:関数名を直接記述して呼び出します(例:add(2, 3))。この場合、thisはグローバルオブジェクト(ブラウザ環境ではwindow)を参照します。 メソッドとしての呼び出し:オブジェクトのプロパティ経由で呼び出します(例:obj.welcome())。この場合、thisはそのオブジェクト自身を参照するため、オブジェクトが持つプロパ
-
【初心者向け】Pythonの関数とメソッドの違いを徹底解説!基本構文と実例つき
関数(Function)とは 関数とは、特定のタスクを実行するためにまとめられたコードブロックです。独自のスコープを持ち、名前を指定して呼び出します。引数は0個でも複数個でもよく、処理の終了時に値を返すことも、返さないことも可能です。 関数の基本構文 def 関数名(引数1, 引数2, ...): # 関数本体 それでは、ごくシンプルな「sum」という関数を作成してみましょう(関数名は自由に付けてかまいません)。この関数は num1 と num2 という2つの引数を受け取り、その合計を返します。sum(5, 6) のように呼び出すと、11 が返されます。 def sum(num1