ポリモーフィズムは C# の重要な概念の 1 つです。ポリモーフィズムには、コンパイル時と実行時の 2 つのタイプがあります。これを実現するために、オーバーロードとオーバーライドの概念がそれぞれ使用されます。オーバーライドでは、子クラスは親クラスのメソッドを別の方法で実装できますが、子クラスのメソッドは親と同じ名前と同じメソッド シグネチャを持ちますが、オーバーロードではクラス内に同じ名前で異なるパラメーターを持つ複数のメソッドが存在します。
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 は、この子クラスが親クラスと同じ名前と同じメソッド シグネチャを持つことを意味します。
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 があります。
出力:
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(); } } }
出力:
この例では、派生クラスには、基本クラスのメソッドを呼び出すために使用される基本キーワードがあります。したがって、その場合、派生メソッドは基本クラスのメソッドの後に呼び出されます。
留意事項:
オーバーロードでは、異なるメソッド シグネチャを持つ複数のメソッドが存在します。以下は、パラメーターの数、パラメーターの順序、パラメーターのデータ型を変更することでオーバーロードを実現する方法を示すいくつかの例です。
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 つのパラメーターがあります。これはメソッドのオーバーロードと呼ばれます。
出力:
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 データ型を持ちます。したがって、この場合、データ型が異なるためパラメータが異なります。
出力:
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# でのオーバーロードとオーバーライドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。