ホームページ  >  記事  >  バックエンド開発  >  C# でのオーバーロードとオーバーライド

C# でのオーバーロードとオーバーライド

WBOY
WBOYオリジナル
2024-09-03 15:13:14767ブラウズ

ポリモーフィズムは C# の重要な概念の 1 つです。ポリモーフィズムには、コンパイル時と実行時の 2 つのタイプがあります。これを実現するために、オーバーロードとオーバーライドの概念がそれぞれ使用されます。オーバーライドでは、子クラスは親クラスのメソッドを別の方法で実装できますが、子クラスのメソッドは親と同じ名前と同じメソッド シグネチャを持ちますが、オーバーロードではクラス内に同じ名前で異なるパラメーターを持つ複数のメソッドが存在します。

C# でオーバーライドとオーバーロードはどのように機能しますか?

C# でのオーバーライドとオーバーロードの仕組みを例を挙げて以下に説明します。

オーバーライド

virtual、override、base など、オーバーライドに使用するキーワードがいくつかあります。

構文:

class Parent
{
public virtual void Example() // base class
{
Console.WriteLine("parent class");
}
}
class Child: Parent
{
public override void Example() // derived class
{
base.Example();
Console.WriteLine("Child class");
}
}

ここでは、virtual キーワードと override キーワードが使用されています。これは、基本クラスが仮想であり、子クラスがこのクラスを実装できることを意味し、override は、この子クラスが親クラスと同じ名前と同じメソッド シグネチャを持つことを意味します。

例 #1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverridingExample
{
class Subject           // base class
{
public virtual void study()              // base class method
{
Console.WriteLine("Study all the subjects");
}
}
class Mathematics: Subject      //  derived class
{
public override void study()        // derived class method
{
Console.WriteLine("Study Mathematics");
}
}
class Program
{
// main method
static void Main(string[] args)
{
Subject s = new Mathematics();
s.study();
Console.ReadLine();
}
}
}

上記の例では、メソッド名は同じですが、実装が異なります。基本クラスには仮想があり、そのおかげで子クラスは独自の方法で親クラスのメソッドを実装できます。子クラスのメソッドには、このメソッドがオーバーライド メソッドであることを示すキーワード override があります。

出力:

C# でのオーバーロードとオーバーライド

例 #2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverridingExample
{
class Subject             // base class
{
public virtual void study()              // base class method
{
Console.WriteLine("Study all the subjects");
}
}
class Mathematics: Subject      //  derived class
{
public override void study()        // derived class method
{
base.study();
Console.WriteLine("Study Mathematics");
}
}
class Program
{
// main method
static void Main(string[] args)
{
Mathematics m = new Mathematics();
m.study();
Console.ReadLine();
}
}
}

出力:

C# でのオーバーロードとオーバーライド

この例では、派生クラスには、基本クラスのメソッドを呼び出すために使用される基本キーワードがあります。したがって、その場合、派生メソッドは基本クラスのメソッドの後に呼び出されます。

留意事項:

  • オーバーライドの概念では、メソッドの名前、メソッドのシグネチャ、アクセス修飾子は常に親クラスと子クラスの名前と同じです。
  • 親クラスのメソッドを静的にすることはできません。

過負荷

オーバーロードでは、異なるメソッド シグネチャを持つ複数のメソッドが存在します。以下は、パラメーターの数、パラメーターの順序、パラメーターのデータ型を変更することでオーバーロードを実現する方法を示すいくつかの例です。

例 #1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
{
class Demo
{
public int Sum(int x, int y)
{
int value = x + y;
return value;
}
public int Sum(int x, int y, int z)
{
int value = x + y + z;
return value;
}
public static void Main(string[] args) // main method
{
Demo d = new Demo();
int sum1 = d.Sum(24, 28);
Console.WriteLine("sum of the two "
+ "integer value : " + sum1);
int sum2 = d.Sum(10, 20, 30);
Console.WriteLine("sum of the three "
+ "integer value : " + sum2);
Console.ReadLine();
}
}
}

上記の例には、名前は同じですがパラメータの数が異なる 2 つのメソッドがあります。  最初のメソッドは 2 つのパラメーターで構成され、2 番目のメソッドには 3 つのパラメーターがあります。これはメソッドのオーバーロードと呼ばれます。

出力:

C# でのオーバーロードとオーバーライド

例 #2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
{
class Demo
{
public int Sum(int x, int y, int z)
{
int value = x + y + z;
return value;
}
public double Sum(double x, double y, double z)
{
double value = x + y + z;
return value;
}
public static void Main(string[] args) // main method
{
Demo d = new Demo();
int sum1 = d.Sum(24, 28,7);
Console.WriteLine("sum of the two "
+ "integer value : " + sum1);
double sum2 = d.Sum(10.0, 20.0, 30.0);
Console.WriteLine("sum of the three "
+ "integer value : " + sum2);
Console.ReadLine();
}
}
}

上記の例には、同じ名前のメソッドが 2 つありますが、データ型が異なります。最初のメソッドは整数データ型を持ち、2 番目のメソッドは double データ型を持ちます。したがって、この場合、データ型が異なるためパラメータが異なります。

出力:

C# でのオーバーロードとオーバーライド

例 #3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
{
class Demo
{
public void Details(String name,int id)
{
Console.WriteLine("Name " + name + ", "
+ "Id " + id); ;
}
public void Details(int id,string name)
{
Console.WriteLine("Name " + name + ", "
+ "Id " + id);
}
public static void Main(string[] args) // main method
{
Demo d = new Demo();
d.Details("John", 10);
d.Details("Joe", 20);
Console.ReadLine();
}
}
}

上記の例では、メソッドの名前は同じですが、パラメータの順序が異なります。最初のメソッドには、それぞれ名前と ID があります。一方、2 番目のものにはそれぞれ ID と名前が付いています。

出力:

C# でのオーバーロードとオーバーライド

留意事項:

  • オーバーロードの概念では、順序、型、番号の場合に同じパラメーターを持つ複数のメソッドを定義することはできません。
  • さまざまな戻り値の型に基づいてメソッドをオーバーロードすることはできません。

C# でのオーバーロードとオーバーライドの利点

以下に利点を説明します。

  • オーバーロードは静的を実現する方法の 1 つであり、オーバーライドは C# が動的多態性を実現する方法の 1 つです。
  • ユーザーに柔軟性とコードの簡潔さを提供します。

結論

オーバーロードとオーバーライドは、ポリモーフィズムを実現する上で重要な役割を果たします。オーバーライドすると、派生クラスが独自の方法で実装できるようになります。一方、オーバーロードとは、同じ名前のメソッドとさまざまな種類のパラメーターの実装に関するものです。

以上がC# でのオーバーロードとオーバーライドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。