オーバーロードとオーバーライドの違い


メソッドのオーバーロードとオーバーライドは、2つの一般的な形態(メソッドやクラスの複数の形式を持つ能力)です.本論文では,二つの間の相違をいくつかの実用的なコード例で示した.

過負荷
オーバーロードは、同じクラス内で複数のメソッドを持つことができますが、別のパラメーターでは、同じ名前です.これらのメソッドはそれぞれ独自の実装を持っています.
オーバーロードは、コンパイル時(または静的)の多型として知られています.これは、さまざまなオーバーロードされたメソッドのそれぞれがアプリケーションのコンパイル時に解決されるためです.
オーバーロードを実証するには、オーバーロードを使用しない電卓クラスを起動します.
public class Calculator
{
    public int AddTwoInt(int a, int b) => a + b;
    public int AddThreeInt(int a, int b, int c) => a + b +c;
    public double AddTwoDouble(double a, double b) => a + b;
    public double AddThreeDouble(double a, double b, double c) => a + b + c;
} 
ここでは、4つの異なるメソッドを完全に別の名前、それぞれの基本的に同じ機能を実行すると、ちょうど別のタイプとパラメータの量を実行します.それはあなたがそれぞれの異なるメソッドの名前とパラメータを覚えているので、対処するためにかなり混乱したインターフェイスです.
代わりに、このクラスを再設定してオーバーロードを行うことができます.
public class Calculator
{
    public int Add(int a, int b) => a + b;
    public int Add(int a, int b, int c) => a + b +c;
    public double Add(double a, double b) => a + b;
    public double Add(double a, double b, double c) => a + b + c;
} 
今、すべてのメソッドは、単にプログラマとして扱うための非常にシンプルなインターフェイスですaddと呼ばれています.我々は単に、我々が持っているパラメータを使用して、Addメソッドを呼び出すことができますコンパイラは、自動的に使用する実際の実装を使用するために動作します!
var calc = new Calculator();

int a = 5;
int b = 6;
// calls int Add(int a, int b)
calc.Add(a, b); 

double c = 4.2
double d = 5.41
double e = 2.57
// calls double Add(double a, double b, double c) 
calc.Add(c, d, e);


オーバーライド
一方、オーバーライドは、親クラスから継承するクラスのメソッドの実装を再定義する機能です.メソッドがオーバーライドされると、名前とパラメーターは同じになりますが、呼び出される実装は呼び出し元のオブジェクトの型によって異なります.
オーバーライドは、呼び出し元のオブジェクトの型がランタイムまで知られていないため、ランタイム(または動的)の多型として知られています.したがって、実行時にメソッドの実装が決定されます.
例として、WOOFメソッドを使用したドッグクラスという基本クラスがあります.このメソッドをクラスを継承することで上書きできるように、メソッドを仮想メソッドとしてマークします.
public class Dog
{
    public virtual void Woof()
    {
        Console.WriteLine("Woof!");
    }
}
現在このクラスと継承クラスは、ドッグクラスで定義されているWooofメソッドを使用します.
public class BigDog : Dog 
{
}

var dog = new Dog();
var bigDog = new BigDog();

dog.Woof() // prints Woof!
bigDog.Woof() // prints Woof!
しかし、継承されたクラスにはWOOFの実装が異なるようにメソッドをオーバーライドすることもできます.
public class YappyDog : Dog
{
    public override void Woof()
    {
        Console.WriteLine("Woof! Woof! Woof!");
    }
}

var dog = new Dog();
var yappyDog = new YappyDog();

dog.Woof() // prints Woof!
yappyDog.Woof() // prints Woof! Woof! Woof!
ここでベースドッグクラスはまだそれ自身の実装を使用しますが、継承されたYappydogはそれが使用するそれ自身の上書きされた実装を持っています.アプリケーションは実行時にクラスの種類がどのようなものであるかを確認します(dogまたはyappydog).

結論
ここでは,c負荷,過負荷,過越の2つの形態を比較した.私たちは、
  • オーバーロードはコンパイル時に決定され、静的です.オーバーライドは、ランタイムで決定され、動的です.
  • は、同じ名前の異なったパラメタを持つメソッドを与えている懸念をオーバーロードします.継承されたクラスで同じメソッドの別の実装を定義する問題のオーバーライド.
  • それがほとんどクリスマスであるので、あなたはHashNodeに最近紹介された私のTop Christmas Gifts To Buy A Developerポストをチェックすることもできました.
    私は、ほとんど完全なスタックについてポストします.NETとVue Web開発.あなたはすべての記事をお見逃しなく確認するには、このブログとsubscribe to my newsletterに従ってください.あなたがこのポスト役に立つとわかるならば、それを好きで、それを共有してください.また、私を見つけることができます.