메소드를 “가상”으로 선언하는 이유는 무엇입니까?
가상을 사용하면 어떤 이점이 있습니까?
답변
가상 수정이 방법 \ 속성 (요법)을 사용하여 도출 된 클래스에서 변형 될 수 있다는 표시로 이용된다 오버라이드 개질제.
예:
class A
{
public virtual void Foo()
//DoStuff For A
}
class B : A
{
public override void Foo()
//DoStuff For B
//now call the base to do the stuff for A and B
//if required
base.Foo()
}
답변
Virtual을 사용하면 상속하는 클래스가 기본 클래스가 사용하는 메서드를 대체 할 수 있습니다.
public class Thingy
{
public virtual void StepA()
{
Console.Out.WriteLine("Zing");
}
public void Action()
{
StepA();
Console.Out.WriteLine("A Thingy in Action.");
}
}
public class Widget : Thingy
{
public override void StepA()
{
Console.Out.WriteLine("Wiggy");
}
}
class Program
{
static void Main(string[] args)
{
Thingy thingy = new Thingy();
Widget widget = new Widget();
thingy.Action();
widget.Action();
Console.Out.WriteLine("Press any key to quit.");
Console.ReadKey();
}
}
프로그램을 실행할 때 출력은 다음과 같습니다.
Zing
A Thingy in Action.
Wiggy
A Thingy in Action.
Widget이 Thingy 수준에서 정의 된 Action () 메서드를 호출했지만 내부적으로 Thingy가 Widget의 StepA () 메서드를 호출 한 방법에 주목하십시오.
기본적인 대답은 클래스 상속자에게 더 많은 유연성을 제공한다는 것입니다. 물론 수업을 잘 설계해야합니다. 그렇지 않으면 약한 혼란이 생길 수 있습니다.
답변
가상 메서드는 실제 메서드 호출이 기본 개체의 런타임 유형에 따라 달라지는 메서드 유형입니다.
비가 상 메서드는 호출되는 실제 메서드가 메서드 호출 시점에서 개체의 참조 형식에 따라 달라지는 메서드 유형입니다.
답변
virtual 키워드는 메서드 또는 속성 선언을 수정하는 데 사용되며,이 경우 메서드 또는 속성을 가상 멤버라고합니다. 가상 멤버의 구현은 파생 클래스의 재정의 멤버에 의해 변경 될 수 있습니다.
가상 메서드가 호출되면 개체의 런타임 유형에서 재정의 멤버를 확인합니다. 가장 많이 파생 된 클래스의 재정의 멤버가 호출되며 파생 클래스가 멤버를 재정의하지 않은 경우 원래 멤버 일 수 있습니다. (런타임 유형 및 대부분의 파생 된 구현에 대한 자세한 내용은 10.5.3 가상 메서드를 참조하십시오.)
기본적으로 메서드는 가상이 아닙니다. 비가 상 메서드는 재정의 할 수 없습니다.
다음 수정 자와 함께 가상 수정자를 사용할 수 없습니다.
정적 추상 재정의
가상 속성은 선언 및 호출 구문의 차이를 제외하고 추상 메서드처럼 작동합니다.
- 정적 속성에 가상 수정자를 사용하는 것은 오류입니다.
- 상속 된 가상 속성은 override 한정자를 사용하는 속성 선언을 포함하여 파생 클래스에서 재정의 할 수 있습니다.
답변
클래스에서 파생 할 계획이 없더라도 클래스를 모의하기 위해 가상 메서드를 표시해야 할 수 있습니다. 일부 모의 프레임 워크는 가상 메서드를 모의하는 것만 허용합니다. 인터페이스를 구현하는 메서드는 암시 적으로 가상입니다.
저는 이러한 제한이있는 RhinoMocks를 사용하고 있으며 이러한 이유로 기본적으로 내 메서드를 가상으로 표시했습니다. 저에게있어 상속이 시작되는 경우가 훨씬 적기 때문에 가상 메서드를 사용하는 가장 큰 이유 일 것입니다.
답변
가상 메서드는 파생 클래스에 대한 구현이 선택 사항이라는 점을 제외하면 기본 클래스의 추상 메서드와 유사합니다. 또한 가상 메서드에 논리를 넣고 파생 클래스에서이를 재정의 할 수 있습니다.
답변
짧은 질문, 짧은 답변! 자신이 속한 클래스를 상속 할 것이라고 생각되면 메서드를 “가상”으로 한정하십시오.
더 긴 대답 : “가상을 사용하면 파생 클래스에서 메서드의 또 다른 의미를 제공하기 위해 재정의 할 수 있습니다.