オーバーロードとオーバーライドの違いは何ですか。
オーバーロードとオーバーライドの違いは何ですか。
回答:
過負荷
オーバーロードとは、同じスコープ内に同じ名前でシグネチャが異なる複数のメソッドがある場合です。
//Overloading
public class test
{
public void getStuff(int id)
{}
public void getStuff(string name)
{}
}
オーバーライド
オーバーライドは、子クラスのメソッドの機能を変更できるようにする原則です。
//Overriding
public class test
{
public virtual void getStuff(int id)
{
//Get stuff default location
}
}
public class test2 : test
{
public override void getStuff(int id)
{
//base.getStuff(id);
//or - Get stuff new location
}
}
void
のためgetStuff
にtest2
getStuff(2, "Hello world!");
またはこれを行うことができますgetStuff("Myname", "Mysurname", "Hello World!");
か?誰でもこれがそれを行う方法であることを確認できますか?
オーバーロードとオーバーライドの簡単な定義
オーバーロード(コンパイル時ポリモーフィズム)::名前が同じでパラメーターが異なる関数
public class A
{
public void print(int x, int y)
{
Console.WriteLine("Parent Method");
}
}
public class B : A
{
public void child()
{
Console.WriteLine("Child Method");
}
public void print(float x, float y)
{
Console.WriteLine("Overload child method");
}
}
オーバーライド(実行時ポリモーフィズム)::基本クラスと同じ名前と同じパラメーターを持つ拡張クラスの関数ですが、動作が異なります。
public class A
{
public virtual void print()
{
Console.WriteLine("Parent Method");
}
}
public class B : A
{
public void child()
{
Console.WriteLine("Child Method");
}
public override void print()
{
Console.WriteLine("Overriding child method");
}
}
私が学んでいたときに私にとって非常に理にかなった例を共有したいと思います。
これは、仮想メソッドや基本クラスを含まない単なる例です。主なアイデアに関するヒントを与えるためだけに。
洗車機があり、「洗車」という機能があり、車を型として受け付けるとします。
Car入力を取得し、Carを洗浄します。
public void Wash(Car anyCar){
//wash the car
}
Wash()関数をオーバーロードしましょう
オーバーロード:
public void Wash(Truck anyTruck){
//wash the Truck
}
洗浄機能は以前は車を洗浄するだけでしたが、現在はトラックを洗浄するために過負荷になっています。
Wash()関数をオーバーライドしましょう
オーバーライド:
public override void Wash(Car anyCar){
//check if the car has already cleaned
if(anyCar.Clean){
//wax the car
}
else{
//wash the car
//dry the car
//wax the car
}
}
ウォッシュ機能には、車がすでに洗浄されており、再度洗浄する必要がないかどうかを確認するための条件があります。
車がきれいなら、ワックスを塗るだけです。
きれいでない場合は、まず車を洗ってから乾かしてからワックスをかけます
。
そのため、新しい機能を追加したり、まったく異なることを行ったりして、機能がオーバーライドされています。
聡明なインタビュアーは次のようにフォローアップするでしょう:
名前が同じでパラメータが異なるメソッド/コンストラクタを複数持つことをオーバーロードと呼びます。これはコンパイル時のイベントです。
Class Addition
{
int add(int a, int b)
{
return a+b;
}
int add(int a, int b, int c)
{
return a+b+c;
}
public static main (String[] args)
{
Addition addNum = new Addition();
System.out.println(addNum.add(1,2));
System.out.println(addNum.add(1,2,3));
}
}
O / p:
3
6
オーバーライドは実行時イベントです。つまり、コードに基づいて、実行時に出力が変化します。
class Car
{
public int topSpeed()
{
return 200;
}
}
class Ferrari extends Car
{
public int topSpeed()
{
return 400;
}
public static void main(String args[])
{
Car car = new Ferrari();
int num= car.topSpeed();
System.out.println("Top speed for this car is: "+num);
}
}
topSpeed()の両方のクラスに共通のメソッドがあることに注意してください。フェラーリをインスタンス化したため、異なる結果が得られます。
O / p:
Top speed for this car is: 400
C#では、キーワードのオーバーライドなしでは、隠されたオーバーライドのようなJavaはありませんオーバーライドするメソッドにが。これらのC#実装を参照してください。
オーバーライドなしのバリアント1 :結果は200
class Car {
public int topSpeed() {
return 200;
}
}
class Ferrari : Car {
public int topSpeed(){
return 400;
}
}
static void Main(string[] args){
Car car = new Ferrari();
int num= car.topSpeed();
Console.WriteLine("Top speed for this car is: "+num);
Console.ReadLine();
}
オーバーライドキーワードを含むバリアント2 :結果は400
class Car {
public virtual int topSpeed() {
return 200;
}
}
class Ferrari : Car {
public override int topSpeed(){
return 400;
}
}
static void Main(string[] args){
Car car = new Ferrari();
int num= car.topSpeed();
Console.WriteLine("Top speed for this car is: "+num);
Console.ReadLine();
}
Carクラスのキーワードvirtualは、Javaのfinalの反対です。つまり、finalではないので、オーバーライドするか、Carが抽象的である場合は実装できます。
shadowing =は派生クラスで2つの定義を維持し、基本クラス定義を投影するために、派生クラス定義をシャドウイング(非表示)します。逆も同様です。
追加するもう一つのポイント。
過負荷同じ名前を持つ複数のメソッドを。同じまたは異なる戻り値の型。パラメータの数またはパラメータのタイプが異なります。同じクラスまたは派生クラス。
int Add(int num1、int num2)int Add(int num1、int num2、int num3)double Add(int num1、int num2)double Add(double num1、double num2)
同じクラスまたは派生クラスで可能です。一般的に同じクラスを好む。たとえば、Console.WriteLine()には19個のオーバーロードメソッドがあります。
クラスコンストラクター、メソッドをオーバーロードできます。
コンパイル時間(静的/アーリーバインディング)ポリモーフィズムと見なすことができます。
================================================== ================================================== =
オーバーライド同じクラスで行うことはできません。クラスのメソッド、プロパティ、インデクサー、イベントをオーバーライドできます。
オーバーライドされた基本メソッドは、仮想、抽象、またはオーバーライドでなければならないなどの制限があります。new、static、またはvirtual修飾子を使用してオーバーライドメソッドを変更することはできません。
ランタイム(動的/遅延バインディング)の多型と見なすことができます。
バージョン管理に役立ちますhttp://msdn.microsoft.com/en-us/library/6fawty39.aspx
================================================== ================================================== =
便利なリンク
http://msdn.microsoft.com/en-us/library/ms173152.aspx コンパイル時のポリモーフィズムと実行時のポリモーフィズム
オーバーロードは静的なポリモーフィズムの一部であり、同じ名前で異なるシグネチャを持つ異なるメソッドを実装するために使用されます。オーバーライドは、不完全なメソッドを完了するために使用されます。私の意見では、これら2つの概念の比較はありません。唯一の類似点は、両方とも同じ語彙が終わっていることです。
メソッドのオーバーロードとメソッドのオーバーライドは、まったく異なる2つの異なる概念です。メソッドのオーバーロードは、メソッド名は同じですが、署名が異なります。メソッドのオーバーライドにより、派生クラスの基本クラスメソッドのデフォルト実装が変更されます。以下に、これらの概念を説明する2つの優れたビデオチュートリアルがあります。
オーバーロードとは、同じシグネチャまたは同じ名前のメソッドを持っているが、パラメーターとオーバーライドが異なるという概念です。異なるパラメーターの同じ名前のメソッドがあり、継承もオーバーライドと呼ばれています。