우리는 다형성 을 언급하지 않고 가상 멤버에 대해 이야기 할 수 없습니다 . 실제로 virtual로 표시된 기본 클래스의 함수, 속성, 인덱서 또는 이벤트 는 파생 클래스에서 재정의를 허용합니다.
기본적 으로 클래스 멤버는 가상 이 아니며 정적, 추상, 개인 또는 재정의 수정자인 경우 표시 할 수 없습니다.
예 System.Object
의 ToString () 메서드를 살펴 보겠습니다 . 이 메서드는 System.Object의 멤버이므로 모든 클래스에서 상속되며 모든 클래스에 ToString () 메서드를 제공합니다.
namespace VirtualMembersArticle
{
public class Company
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Company company = new Company() { Name = "Microsoft" };
Console.WriteLine($"{company.ToString()}");
Console.ReadLine();
}
}
}
이전 코드의 출력은 다음과 같습니다.
VirtualMembersArticle.Company
Company 클래스의 System.Object에서 상속 된 ToString () 메서드의 표준 동작을 변경하려고합니다. 이 목표를 달성하려면 override 키워드를 사용하여 해당 메소드의 다른 구현을 선언하는 것으로 충분합니다.
public class Company
{
...
public override string ToString()
{
return $"Name: {this.Name}";
}
}
이제 가상 메서드가 호출되면 런타임은 파생 클래스에서 재정의하는 멤버를 확인하고 존재하는 경우이를 호출합니다. 그러면 응용 프로그램의 출력은 다음과 같습니다.
Name: Microsoft
실제로 System.Object 클래스를 확인하면 메서드가 가상으로 표시됩니다.
namespace System
{
[NullableContextAttribute(2)]
public class Object
{
....
public virtual string? ToString();
....
}
}