C# におけるオーバーライドとは、派生クラスでの基本クラスのメソッドの再実装です。この場合、基本クラスのメソッドが子クラスでオーバーライドされます。派生クラス メソッドは、基本クラス メソッドと同じ名前とシグネチャを持ちます。オーバーライドは、実行時ポリモーフィズムを実現するのに役立ちます。
メソッドのオーバーライドで使用されるキーワードがいくつかあります。
1.仮想 – このキーワードは、基本クラスのメソッドをオーバーライドできることを示す基本クラスで使用されます。
public virtual void Method() { // implementation }
2.オーバーライド – このキーワードは派生クラスで使用され、派生クラスが基本クラスのメソッドをオーバーライドすることを示します。
public override void Method() { // implementation }
3. Base – このキーワードは、派生クラスで基本クラスのメソッドを呼び出すために使用されます。
public override void Method() { base.Method(); // implementation }
以下は、C# でオーバーライドを実装する方法の例です。
class Parent { public virtual void Demo() // base class { Console.WriteLine(“This is parent”); } } class Child: Parent { public override void Demo() // derived class { Console.WriteLine(“This is child”); } }
上記の例には 2 つのクラスがあり、1 つは基本クラスまたは親クラス、もう 1 つは派生クラス、つまり子クラスです。基本クラスのメソッドは子クラスで派生されます。この場合、親のメソッドは仮想であり、子クラスによってオーバーライドできることを意味します。子でのオーバーライドは、このメソッドが同じメソッド シグネチャを持つ親クラスのメソッドと同じであることを意味します。
以下は、さまざまなキーワードによるオーバーライドを示す例です。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public new void fly() // derived class method { Console.WriteLine("Peacock is flying"); } } class Program { // main method static void Main(string[] args) { Bird b = new Peacock(); b.fly(); Console.ReadLine(); } } }
上記の例では、ベースメソッドと派生メソッドの両方でキーワードが使用されていません。
main メソッドでも、親参照を使用して子メソッドを呼び出します。したがって、この場合、キーワードが使用されていない場合、子メソッドの代わりに親メソッドが呼び出されます。したがって、出力は
となります。出力:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public virtual void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public override void fly() // derived class method { Console.WriteLine("Peacock is flying"); } } class Program { // main method static void Main(string[] args) { Bird b = new Peacock(); b.fly(); Console.ReadLine(); } } }
この例では、基本クラスで virtual が使用されています。これは、独自の方法でメソッドを実装する権限を子クラスに与えることを意味します。派生クラスでは、オーバーライドが使用されます。これは、子メソッドがオーバーライド メソッドであることを意味します。どちらのメソッドも同じ名前で同じメソッド シグネチャを持ちますが、実装部分が異なります。この例でも、親参照を使用して子メソッドを呼び出します。ただし、親メソッドは仮想メソッドであるため、親メソッドではなく子メソッドが最初に呼び出されます。したがって、出力は
となります。出力:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public virtual void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public override void fly() // derived class method { Console.WriteLine("Peacock is flying"); } } class Program { //main method static void Main(string[] args) { Peacock p = new Peacock(); p.fly(); Console.ReadLine(); } } }
この例は前の例と同じですが、この子メソッドが参考として使用されます。
出力:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public virtual void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public override void fly() // derived class method { base.fly(); // base is use to call parent method Console.WriteLine("Peacock is flying"); } } class Program { static void Main(string[] args) { Peacock p = new Peacock(); p.fly(); Console.ReadLine(); } } }
上記の例では、派生クラスで基底クラスのメソッドを呼び出すために基底が使用されています。したがって、この基本メソッドでは最初に呼び出され、次に派生メソッドが呼び出されます。
出力:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { abstract class Calculate { public abstract int sum(); } class Values : Calculate // derived class { int val1; int val2; public Values(int a = 0, int b = 0) { val1 = a; val2 = b; } public override int sum() { Console.WriteLine("sum of two values"); return (val1 + val2); } } class Program { static void Main(string[] args) { Values v = new Values(10, 20); int a = v.sum(); Console.WriteLine(a); Console.ReadLine(); } } }
上記の例では、抽象メソッドが使用されています。抽象クラスは、抽象メソッドを含む派生クラスによって実装されます。
出力:
オーバーライドは実行時のポリモーフィズムに役立ちます。これにより、派生クラスが独自の方法で基本クラスのメソッドを実装できるようになります。したがって、メソッドの実装は、派生クラスとその基本クラスとは異なります。オーバーライドされるメソッドは、仮想、オーバーライド、または抽象のいずれかになります。
以上がC# でのオーバーライドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。