[c#] 가상 방법이란 무엇입니까?

메소드를 “가상”으로 선언하는 이유는 무엇입니까?

가상을 사용하면 어떤 이점이 있습니까?



답변

가상 수정이 방법 \ 속성 (요법)을 사용하여 도출 된 클래스에서 변형 될 수 있다는 표시로 이용된다 오버라이드 개질제.

예:

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 () 메서드를 호출 한 방법에 주목하십시오.

기본적인 대답은 클래스 상속자에게 더 많은 유연성을 제공한다는 것입니다. 물론 수업을 잘 설계해야합니다. 그렇지 않으면 약한 혼란이 생길 ​​수 있습니다.


답변

가상 메서드는 실제 메서드 호출이 기본 개체의 런타임 유형에 따라 달라지는 메서드 유형입니다.

비가 상 메서드는 호출되는 실제 메서드가 메서드 호출 시점에서 개체의 참조 형식에 따라 달라지는 메서드 유형입니다.


답변

MSDN의 가상 방법

virtual 키워드는 메서드 또는 속성 선언을 수정하는 데 사용되며,이 경우 메서드 또는 속성을 가상 멤버라고합니다. 가상 멤버의 구현은 파생 클래스의 재정의 멤버에 의해 변경 될 수 있습니다.

가상 메서드가 호출되면 개체의 런타임 유형에서 재정의 멤버를 확인합니다. 가장 많이 파생 된 클래스의 재정의 멤버가 호출되며 파생 클래스가 멤버를 재정의하지 않은 경우 원래 멤버 일 수 있습니다. (런타임 유형 및 대부분의 파생 된 구현에 대한 자세한 내용은 10.5.3 가상 메서드를 참조하십시오.)

기본적으로 메서드는 가상이 아닙니다. 비가 상 메서드는 재정의 할 수 없습니다.

다음 수정 자와 함께 가상 수정자를 사용할 수 없습니다.

정적 추상 재정의

가상 속성은 선언 및 호출 구문의 차이를 제외하고 추상 메서드처럼 작동합니다.

  • 정적 속성에 가상 수정자를 사용하는 것은 오류입니다.
  • 상속 된 가상 속성은 override 한정자를 사용하는 속성 선언을 포함하여 파생 클래스에서 재정의 할 수 있습니다.


답변

클래스에서 파생 할 계획이 없더라도 클래스를 모의하기 위해 가상 메서드를 표시해야 할 수 있습니다. 일부 모의 프레임 워크는 가상 메서드를 모의하는 것만 허용합니다. 인터페이스를 구현하는 메서드는 암시 적으로 가상입니다.

저는 이러한 제한이있는 RhinoMocks를 사용하고 있으며 이러한 이유로 기본적으로 내 메서드를 가상으로 표시했습니다. 저에게있어 상속이 시작되는 경우가 훨씬 적기 때문에 가상 메서드를 사용하는 가장 큰 이유 일 것입니다.


답변

가상 메서드는 파생 클래스에 대한 구현이 선택 사항이라는 점을 제외하면 기본 클래스의 추상 메서드와 유사합니다. 또한 가상 메서드에 논리를 넣고 파생 클래스에서이를 재정의 할 수 있습니다.


답변

짧은 질문, 짧은 답변! 자신이 속한 클래스를 상속 할 것이라고 생각되면 메서드를 “가상”으로 한정하십시오.

더 긴 대답 : “가상을 사용하면 파생 클래스에서 메서드의 또 다른 의미를 제공하기 위해 재정의 할 수 있습니다.