2014-09-03 1 views
4

C#에서 메서드 오버로드에 대한 질문이 있습니다. 부모 클래스와 하위 클래스가 있습니다.이 메소드의 오버로드는 어떻게됩니까?

class Parent 
{ 
    public virtual string GetMyClassName() 
    { 
     return "I'm a Parent"; 
    } 
} 

class Child : Parent 
{ 
    public override string GetMyClassName() 
    { 
     return "I'm a Child"; 
    } 
} 

나도 유형의 개체에 대해 조치를 두 클래스의 외부에서 선언 된 두 개의 정적 메소드가 : 나는이 방법이 모든 호출 방법을 테스트 할 때

static string MyClassName(Parent parent) 
{ 
    return "That's a Parent"; 
} 

static string MyClassName(Child child) 
{ 
    return "That's a Child"; 
} 

, 내가 생각하는 것을 얻을 이상한 결과 :

Parent p = new Child(); 
var str1 = MyClassName(p); // = "That's a Parent" 
var str2 = p.GetMyClassName(); // = "I'm a Child" 

str1는 "그것은 부모의"로 설정됩니까? 아마도 C#에서 메서드 오버로드를 오해하고 있습니다. 코드에서 자식 호출을 사용하도록하는 방법이 있습니까 (str1을 "Child"로 설정)? 가상 방법은 해상도가 런타임에서 발생 오버라이드 (override) 동안

+0

참조 : http://stackoverflow.com/questions/13095544/overloaded-method-why-is-base-class-given-precedence – BradleyDotNET

답변

7

왜 str1과이에 "그것은 부모의"설정됩니까?

과부하는 보통 컴파일 시간 인 (실행 시간 아님)에서 결정되기 때문에. 컴파일시에 대상과 인수의 유형을 기반으로 합니다만, dynamic 값을 사용하는 호출은 예외입니다. 이 MyClassName(Parent)

아동 호출을 사용하는 코드를 강제 할 수있는 방법이 있나요 호출 귀하의 경우

는, 인수의 형태가, Parent입니다 (str1과 설정에 "그 아이의")?

두 선택해

  • 과부하 해상도를 강제하는 타입 dynamic의 것으로 p 선언 입력 Child 아닌 Parent
  • 인 것으로 p 선언 실행시 수행되는
+0

옵션 3 : 단일 메서드를 호출하고 형식을 확인하십시오. –

+0

와우, 이전에 Excel COM interop 호출의 외부에서 '동적 인'기능을 사용하지 못했습니다. 감사. – user2023861

2

방법 과부하 해상도, 컴파일시에 발생합니다.

p 유형이 Parent이기 때문에 MyClassName()에 대한 호출이 컴파일시에 Parent 오버로드로 해결됩니다. Child 개체가 실제로 Parent의 인스턴스이므로 (상속으로 인해) 문제가되지 않습니다. (p instanceof Parent가, 심지어 p 참조 만약 Child 객체 사실이라고합니다.)