2

나는 2 개의 과목을 가지고있다.

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }

    public void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public B(string N) : base(N)
    {
    }

    public new void GetName()
    {
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

나는 새 객체를 만든다.B내가 부르려고하는GetName...에서AGetName...에서B

B foo = new B("foo");
foo.GetName(); //  output "oof"

예상 결과"foooof"

나는 이미 시도했다.public new void GetName() : base하지만 컴파일되지 않습니다.

3 답변


2

원하는 출력을 얻으려면base GetName()방법GetName()방법Class B. 예를 들면 다음과 같습니다.

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }

    public void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public B(string N) : base(N)
    {
    }

    public new void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

이것은 밖으로 넣어 것입니다foooof


2

재정의를 사용하고 재정의 된 메서드에서 기본 클래스의 메서드를 호출합니다.

public class A
{
    public virtual void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public override void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

그만큼virtual키워드는 메서드를 수정하고 파생 클래스에서 재정의되도록 허용하는 반면new수정자는 기본 클래스 메서드를 숨 깁니다. 전화base.GetName();당신은 기본 메소드 BTW를 실행하고 있습니다. 이것이 당신이 사용하는 차이점이없는 이유입니다.new또는override내가 추천하는 키워드는 여기에override.

참고 문헌 :

가상 (C #참조)

재정의 및 새 키워드 사용시기 알기


  • base.GetName();없이 일하는 것 같다.override너무 - Toshi
  • @GodofSource virtual 키워드는 메서드를 수정하고 파생 클래스에서 메서드를 재정의하는 데 사용됩니다. 그래서 당신은GetName위의 코드에서 언급 한 것과 같은 결과입니다. - S.Akbari
  • @GodofSource override 수정자는 기본 클래스 메서드를 확장하고 새 한정자가이를 숨 깁니다. 전화 걸기base.GetName();당신은 기본 메소드 BTW를 실행하고 있습니다. 이것이 사용하는 차이점이없는 이유입니다.new또는override이리. 하지만 그걸 알아야 해.new당신은 기본 메소드를 숨기지 만 오버라이드하면 확장했습니다. - S.Akbari
  • @GodofSourcenew위험하다. 자신이하는 일을 모르는 경우에는 사용하지 마세요. - Patrick Hofman
  • 무엇이 "확장"을 의미합니까? - Toshi

0

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }

    public virtual void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public B(string N) : base(N)
    {
    }

    public override void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

원하는대로 재정의하거나 새로 사용하십시오. 이러한 시나리오를 처리하는 것.

            A foo = new B("foo");
            foo.GetName();

또는

            A foo = new A("foo");
            foo.GetName();

또는

            B foo = new B("foo");
            foo.GetName();

msdn 링크당신에게 선명한 그림을 줄 것입니다.

연결된 질문


관련된 질문

최근 질문