web-dev-qa-db-ja.com

オーバーロードとオーバーライド

オーバーロードとオーバーライドの違いは何ですか。

101
james

オーバーロード

オーバーロードは、同じスコープに複数のメソッドがあり、名前が同じで署名が異なる場合です。

//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
        }
}
211
cgreeno

オーバーロードとオーバーライドの簡単な定義

オーバーロード(コンパイル時間ポリモーフィズム)::同じ名前で異なるパラメーターを持つ関数

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");
    }
}
34
Devrath

私が学んでいたときに私にとって非常に理にかなった例を共有したい:

これは、仮想メソッドまたは基本クラスを含まない単なる例です。主なアイデアに関するヒントを提供するだけです。

車両の洗濯機があり、「洗濯」と呼ばれる機能を持ち、車をタイプとして受け入れるとします。

車の入力を取得し、車を洗浄します。

public void Wash(Car anyCar){
       //wash the car
}

Wash()関数をオーバーロードしましょう

オーバーロード:

public void Wash(Truck anyTruck){
   //wash the Truck  
}

洗浄機能は以前は車を洗浄するだけでしたが、現在ではトラックを洗浄するために過負荷になっています。

  • 指定された入力オブジェクトがCarの場合、Wash(Car anyCar)を実行します
  • 指定された入力オブジェクトがトラックの場合、Wash(Truck anyTruck)を実行します

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
   }     
}

ウォッシュ機能には、車がすでにきれいであり、再度洗う必要がないかどうかをチェックする条件があります。

  • 車がきれいなら、ワックスを塗ってください。

  • きれいでない場合は、最初に車を洗ってから乾かしてからワックス

そのため、新しい機能を追加するか、まったく異なることを行うことにより、機能がオーバーライドされました。

9
curiousBoy
  • オーバーロード=複数のメソッドシグネチャ、同じメソッド名
  • オーバーライド=同じメソッドシグネチャ(宣言された仮想)、サブクラスで実装

抜け目のないインタビュアーは次のようにフォローアップしたでしょう

オーバーライドとシャドウイングの違いは何ですか?

9
Michael Meadows

マイケルが言ったように:

  • オーバーロード=複数のメソッドシグネチャ、同じメソッド名
  • オーバーライド=同じメソッドシグネチャ(宣言された仮想)、サブクラスで実装

そして

  • シャドーイング= DerivedClassとして扱われる場合は派生メソッドを使用し、BaseClassとしてはベースメソッドを使用します。
4
Migol

同じ名前で異なるパラメーターを持つ複数のメソッド/コンストラクターを持つことをオーバーロードと呼びます。これはコンパイル時のイベントです。

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
3
Matt

c#には、hiddenオーバーライドのような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();
    }

overrideキーワードを使用したバリアント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クラスの場合はfinalの場合はJavaの反対です。つまり、not finalの場合は、オーバーライド、またはCarが抽象の場合は実装

2
Nurlan

shadowing =派生クラスで2つの定義を維持し、基本クラス定義を投影するために、派生クラス定義をシャドウ(非表示)にします。

1
ramya choudary

オーバーロードは静的ポリモーフィズムの一部であり、同じ名前で異なるシグネチャを持つ異なるメソッドを実装するために使用されます。 オーバーライドは、不完全なメソッドを完了するために使用されます。私の意見では、これらの2つの概念に比較はありません。唯一のことは、両方が同じ語彙で終わるということです。

1
Moeed

追加する別のポイント。

オーバーロード同じ名前の複数のメソッド。同じまたは異なる戻り値の型。異なるパラメーターの数または異なるタイプのパラメーター。同じクラスまたは派生クラス。

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コンパイル時ポリモーフィズムと実行時ポリモーフィズム

1
Sai

オーバーロードとは、同じ名前の同じシグネチャまたはメソッドを持っているが、異なるパラメーターとオーバーライドを持っているという概念です。異なる名前の同じ名前のメソッドがあり、継承もオーバーライドと呼ばれます。

0
waqas ur Rehman

メソッドのオーバーロードとメソッドのオーバーライドは、まったく異なる2つの概念です。メソッドのオーバーロードは、メソッド名は同じですが署名が異なります。メソッドのオーバーライドは、派生クラスの基本クラスメソッドのデフォルト実装を変更しています。以下に、これらの概念を説明する2つの優れたビデオチュートリアルがあります。

非表示と非表示をオーバーライドするメソッド

メソッドのオーバーロード

0
Suresh