プログラミングに関して「過負荷」/「過負荷」とはどういう意味ですか?
8 に答える
これは、同じ名前の関数 (メソッドまたは演算子) を提供していることを意味しますが、署名は異なります。例えば:
void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
基本的な考え方
オーバーロード、または「メソッドのオーバーロード」は、同じ名前でパラメーターが異なる複数のメソッドを持つ概念の名前です。
たとえば、C# の System.DateTime クラスには複数の ToString メソッドがあります。標準の ToString は、システムの既定のカルチャを使用して、日時を文字列に変換します。
new DateTime(2008, 11, 14).ToString(); // returns "14/11/2008" in America
同じメソッドの別のオーバーロードにより、ユーザーはフォーマットをカスタマイズできます。
new DateTime(2008, 11, 14).ToString("dd MMM yyyy"); // returns "11 Nov 2008"
パラメーター名は同じでも、パラメーターの型が異なる場合があります。
Convert.ToInt32(123m);
小数を整数に変換します
Convert.ToInt32("123");
文字列を int に変換します。
過負荷の解決
呼び出すのに最適なオーバーロードを見つけるために、コンパイラは「オーバーロードの解決」という名前の操作を実行します。最初の例では、コンパイラは引数の数を照合するだけで最適なメソッドを見つけることができます。2 番目の例では、コンパイラは、10 進数のパラメーターを渡すと置換メソッドの 10 進数バージョンを自動的に呼び出し、文字列パラメーターを渡すと文字列バージョンを呼び出します。可能な出力のリストから、コンパイラが呼び出すのに適したものを見つけられない場合、「最適なオーバーロードがパラメーターと一致しません...」のようなコンパイラ エラーが発生します。
さまざまなコンパイラがオーバーロードの解決をどのように実行するかについて、多くの情報を見つけることができます。
関数に複数のシグネチャがある場合、その関数はオーバーロードされます。これは、異なる引数タイプで呼び出すことができることを意味します。たとえば、変数を画面に出力する関数があり、さまざまな引数の型に対して定義できます。
void print(int i);
void print(char i);
void print(UserDefinedType t);
この場合、関数 print() には 3 つのオーバーロードがあります。
これは、異なるタイプのパラメーターを取る同じ関数の異なるバージョンを持つことを意味します。そのような機能は「過負荷」です。たとえば、次の関数を使用します。
void Print(std::string str) {
std::cout << str << endl;
}
この関数を使用して、文字列を画面に出力できます。ただし、この関数は整数を出力する場合には使用できません。次のように、関数の 2 番目のバージョンを作成できます。
void Print(int i) {
std::cout << i << endl;
}
これで関数がオーバーロードされ、関数のどのバージョンが呼び出されるかは、指定したパラメーターに依存します。
他の人は過負荷とは何かと答えています。始めたばかりのときは、オーバーライド/オーバーライドと混同されます。
オーバーロードとは対照的に、オーバーライドはサブクラス (または子クラス) で同じシグネチャを持つメソッドを定義することであり、親クラスの実装をオーバーライドします。virtual
一部の言語では、C++ またはoverride
Delphi と C# のメンバー関数など、明示的なディレクティブが必要です。
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
オーバーロードされたメソッドは、パラメーターの数と型に関する複数のオプションを持つメソッドです。例えば:
foo(foo)
foo(foo, bar)
どちらも比較的同じことを行いますが、1 つにはより多くのオプションのための 2 番目のパラメーターがあります
また、同じメソッドに異なるタイプを持たせることもできます
int Convert(int i)
int Convert(double i)
int Convert(float i)
一般的な用法と同様に、何か (この場合はメソッド名) を参照し、複数のジョブを実行します。
オーバーロードは、 CLOS やその他の言語のマルチメソッドの貧弱なバージョン です。紛らわしい方です。
オーバーライドは通常の OO のものです。それは継承に伴い、再定義とも呼ばれます(たとえば、https://stackoverflow.com/users/3827/eed3si9nの回答 Line
では、Draw()
.