>  기사  >  백엔드 개발  >  C#에서 재정의

C#에서 재정의

PHPz
PHPz원래의
2024-09-03 15:13:28809검색

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#에서 재정의는 어떻게 작동하나요?

다음은 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”);
}
}

위의 예에는 두 개의 클래스가 있습니다. 하나는 기본 클래스 또는 상위 클래스이고 다른 하나는 파생 클래스 또는 하위 클래스라고 할 수 있습니다. 기본 클래스 메서드는 하위 클래스에서 파생됩니다. 여기서 부모의 메서드는 가상이므로 자식 클래스에서 재정의할 수 있습니다. 하위 재정의는 이 메소드가 동일한 메소드 시그니처를 가진 상위 클래스 메소드와 동일하다는 것을 의미합니다.

C#의 재정의 유형

다음은 다양한 키워드로 재정의되는 예입니다.

예 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();
}
}
}

위의 예에서는 기본 메소드와 파생 메소드 모두에 키워드가 사용되지 않았습니다.

메인 메소드에서도 상위 참조를 사용하여 하위 메소드를 호출합니다. 따라서 이 경우 키워드가 사용되지 않으면 자식 메서드 대신 부모 메서드가 호출됩니다. 따라서 출력은

출력 :

C#에서 재정의

예 2 (a) - 가상 및 재정의 키워드 사용

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이 사용되었습니다. 이는 하위 클래스에 자체 방식으로 메서드를 구현할 수 있는 권한을 부여한다는 의미입니다. 파생 클래스에서는 재정의가 사용됩니다. 이는 하위 메서드가 재정의 메서드임을 의미합니다. 두 메소드 모두 이름과 메소드 서명이 동일하지만 구현 부분이 다릅니다. 이 예에서도 상위 참조는 하위 메소드를 호출하는 데 사용됩니다. 그러나 부모 메서드는 가상이므로 부모 메서드 대신 자식 메서드가 먼저 호출됩니다. 따라서 출력은

출력 :

C#에서 재정의

예 2 (b) – 가상 및 재정의 키워드

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();
}
}
}

이 예시는 이전 예시와 동일하지만 이 아이의 방식을 참고로 사용했습니다.

출력 : 

C#에서 재정의

예 3 – 기본 키워드 사용

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();
}
}
}

위의 예에서 베이스는 파생 클래스에서 베이스 클래스 메서드를 호출하는 데 사용됩니다. 따라서 이 기본 메서드가 먼저 호출된 다음 파생 메서드가 호출됩니다.

출력 :

C#에서 재정의

예 4 – 재정의를 사용한 추상 클래스

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#에서 재정의

메서드 재정의 규칙

  • 파생 클래스의 메서드 시그니처는 기본 클래스와 동일해야 합니다.
  • 동일 클래스 내에서는 오버라이드가 불가능합니다.
  • 가상 메서드와 재정의 메서드에 대한 액세스 한정자는 동일해야 합니다.
  • 기본 클래스 메소드에서는 virtual 키워드를 사용하고, 파생 클래스 메소드에서는 Override를 사용합니다.
  • 기본 클래스 메서드는 정적이어서는 안 됩니다.

결론

재정의는 런타임 다형성에 유용합니다. 파생 클래스가 자체 방식으로 기본 클래스 메서드를 구현할 수 있도록 합니다. 따라서 메서드 구현은 기본 클래스의 파생 클래스와 다릅니다. 재정의된 메서드는 가상, 재정의 또는 추상일 수 있습니다.

위 내용은 C#에서 재정의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.