C#에서 재정의는 파생 클래스에서 기본 클래스 메서드를 다시 구현하는 것입니다. 여기서 기본 클래스 메서드는 하위 클래스에서 재정의됩니다. 파생 클래스 메서드는 기본 클래스 메서드와 동일한 이름과 서명을 갖습니다. 재정의는 런타임 다형성을 달성하는 데 유용합니다.
메소드 재정의에 사용되는 몇 가지 키워드가 있습니다.
1. Virtual – 이 키워드는 기본 클래스의 메서드를 재정의할 수 있음을 나타내는 기본 클래스와 함께 사용됩니다.
public virtual void Method() { // implementation }
2. Override – 이 키워드는 파생 클래스와 함께 사용되며 파생 클래스가 기본 클래스의 메서드를 재정의함을 나타냅니다.
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”); } }
위의 예에는 두 개의 클래스가 있습니다. 하나는 기본 클래스 또는 상위 클래스이고 다른 하나는 파생 클래스 또는 하위 클래스라고 할 수 있습니다. 기본 클래스 메서드는 하위 클래스에서 파생됩니다. 여기서 부모의 메서드는 가상이므로 자식 클래스에서 재정의할 수 있습니다. 하위 재정의는 이 메소드가 동일한 메소드 시그니처를 가진 상위 클래스 메소드와 동일하다는 것을 의미합니다.
다음은 다양한 키워드로 재정의되는 예입니다.
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(); } } }
위의 예에서는 기본 메소드와 파생 메소드 모두에 키워드가 사용되지 않았습니다.
메인 메소드에서도 상위 참조를 사용하여 하위 메소드를 호출합니다. 따라서 이 경우 키워드가 사용되지 않으면 자식 메서드 대신 부모 메서드가 호출됩니다. 따라서 출력은
출력 :
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!