2014-06-24 3 views
3

이것은 내가 좋아하는 다형성에 대한 또 다른 질문에 기반합니다. 그래서 나는 그것을 가지고 놀았고 그것을 이해하기 위해 그것을 수정했습니다. 그러나 그것은 ploymorphism에 대한 나의 이해를 덜걱 덜걱 소리났다.한 번만 호출하면 다형 메서드가 두 번 실행됩니다.

클래스 내부에 인터페이스를 만들고 클래스 "A"를 만들고 인터페이스 메서드를 구현했습니다. 나는 또한 "A"를 확장하는 또 다른 클래스 "B"를 만들었습니다. 그리고 "B"를 확장하는 또 다른 클래스 "C" 당신이 그것을 실행하면

는, 출력은 다음과 같습니다 AEP 두 가지를하는 것이 그것을 얼마나 A : E

다른 방법에서 기본 PARAM 인 반면 BA-> 부분이 B : A 클래스에서 제공

BA-> AEP

공지 것을 내가 할 때 메서드가 호출됩니다.

`A instance = new C(); 
Console.WriteLine(instance.GetName());` 

왜?

class Program 
{ 
    interface E 
    { 
     string GetName(string s); 

    } 

    public class A : E 
    { 

     public virtual string GetName(string s="AEP") 
     { 
      return s; 
     } 
    } 

    public class B : A 
    { 
     public override string GetName(string s="BAP") 
     { 
      return "BA-> " + s; 
     } 
    } 

    public class C : B 
    { 
     public new string GetName() 
     { 
      return "CB->"; 
     } 
    } 

    static void Main() 
    { 
     A instance = new C(); 
     Console.WriteLine(instance.GetName()); 
     Console.ReadLine(); 
    } 
} 
+0

'return s'를'return s + "bla"'로 변경하면 기본 매개 변수 인 것 같습니다. – Adrian

+0

이것은 중복 된 메소드에 대한 하나의 [C# 선택적 매개 변수] (http : // "AEP"가 표시되고 [C# 키워드 사용법 가상 + 무시]와 [새 기능]에 대해 설명합니다 (http://stackoverflow.com/questions/8909811/c-sharp-optional-parameters-on-overridden-methods). question./ 159978/c-sharp-keyword-usage-virtualoverride-vs-new)'C.GetName'이 전혀 호출되지 않는 이유를 설명합니다 (따라서 출력의 "BA->"부분). 이러한 링크로 인해 문제가 명확하지 않은 경우 의견을 보내 주시기 바랍니다. –

+0

@Zuzlx 왜냐하면 당신은'Main'에서'B'를 사용하지 않기 때문입니다. – Adrian

답변

4

이 메서드는 두 번 호출되지 않습니다. 실행중인 인스턴스가 C이므로 B에서 재정의 된 버전이 호출됩니다. 그러나 정적 유형이 A이기 때문에 A에 정의 된대로 메소드의 기본 인수 값을 사용하고 있습니다. 기본 인수는 호출 사이트에 삽입 된 컴파일 타임 기능이므로 재정의 된 메서드의 값을 고려하지 않습니다.

+1

고마워요. 그렇지 않으면 몇 가지 흥미로운 버그가있을 것입니다. – Zuzlx

0

여기서 기본 매개 변수를 사용하고 있습니다.이 매개 변수는 순수 구문 설탕이며 사용중인 클래스 방법에 따라 컴파일 타임에 해결됩니다. 매개 변수없이 더 GetName() 방법은 없다으로

A instance = new C(); 
    Console.WriteLine(instance.GetName()); 

는, 컴파일러는 기본 매개 변수 값을 사용하고 GetName("AEP")로 (이 컴파일시에 알려진 변수로) 클래스 A에 선언을 사용하여 컴파일합니다.

관련 문제