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


104

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


2
@james:少なくともGoogleを試してみましたか?
ミッチウィート

あなたはこれを手に入れるつもりはないと思います。
Jon B

james-おそらくないと私は非常に愚かなシンプルなコンセプトを説明することができない感じ

1
@james私の推測では、用語を知らずにこれらの概念を直感的に理解したと思います。私はあなたが独学していると思います。学ぶためではなく、すでに知っていることを強化するために、おそらく初心者レベルのC#の本を手に取るべきです。それは面倒なことですが、技術面接で非常に役立ちます。
マイケルメドウズ

:あなたは、このリンクをもっと読むことができますintquesans.blogspot.com/2011/05/...

回答:


219

過負荷

オーバーロードとは、同じスコープ内に同じ名前でシグネチャが異なる複数のメソッドがある場合です。

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

1
私はこの答えが大好きです@cgreeno ..ありがとう
Ferrakkem Bhuiyan

1
私はあなたが欠場と思う@cgreeno voidのためgetStufftest2
マハディ

2
基本クラスのメソッドをオーバーライドするには、基本クラスのメソッドを仮想としてマークする必要があることを述べただけで、コンパイルエラーが発生します。
Alex Stephens

ちょっと、これは古いかもしれませんが、私はまだこれについて質問があります。オーバーロードにより、 'one'メソッドでより多くの機能を利用できるようになりますか?これができるように:getStuff(2, "Hello world!");またはこれを行うことができますgetStuff("Myname", "Mysurname", "Hello World!");か?誰でもこれがそれを行う方法であることを確認できますか?
Sj03rs

オーバーライドの例は実際には上書きであると思います。オーバーライドは、スーパークラスメソッドが誤ってオーバーライドを取得したとき、または両方のケースでnewキーワードを使用してオーバーライドを実行するつもりである場合、オーバーライドまたは上書きの場合、Parent p = newを宣言したときの動作が異なります子(); p.Method(); ...多分私は間違っており、それはほとんど同じことをする別の方法にすぎません。誰かが私よりもそれをよりよく説明できますか?
クリスティーナカラスコ

35

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

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

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

おそらく、オーバーライドの概念が親クラスとサブクラスの関係に適用されることを追加したいと思います。
Freakyuser、2013

10

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

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

洗車機があり、「洗車」という機能があり、車を型として受け付けるとします。

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

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

ウォッシュ機能には、車がすでに洗浄されており、再度洗浄する必要がないかどうかを確認するための条件があります。

  • 車がきれいなら、ワックスを塗るだけです。

  • きれいでない場合は、まず車を洗ってから乾かしてからワックスをかけます

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


1
これが答えでなければなりません。投票済み
ジャック

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

聡明なインタビュアーは次のようにフォローアップするでしょう:

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


それがシャドウイングと呼ばれていることを知りませんでした。オーバーロードとオーバーライドの唯一の関係はオーバーです。
Samuel

4

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

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

そして

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

3

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

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

2

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が抽象的である場合は実装できます。


1

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


1

追加するもう一つのポイント。

過負荷同じ名前を持つ複数のメソッドを。同じまたは異なる戻り値の型。パラメータの数またはパラメータのタイプが異なります。同じクラスまたは派生クラス。

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


必要な詳細を含む、良いもの。
user3885927 2016年

1

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


ここでキャプテン:メソッドをオーバーロードすると、同じ名前の異なるメソッドの複数のシグネチャが得られます。オーバーライドすると、継承されたメンバーがクラスまたはインターフェースから非表示になります。飛ぶ
SparK 2016年

1
@SparKオーバーライドしてもメンバーは非表示になりません。継承されたメンバーを上書きまたは非表示にすることができます。2つは相互に排他的なオプションです。
16年

@Servy、間違った言葉の選択、私は「代用者」を意味しました。
SparK 2016年

0

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

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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.