2011-04-27 4 views
2

은 가능 어떻게 든 다음과 같은 방식을 구현하는 것입니다 구현에 Go(Object)?C# 과부하 문제

+1

출력합니다. 컴파일러에서 간단한 예제를 시도했을 때 무엇을 발견 했습니까? – taylonr

답변

5

이렇게하면 기본적으로 작동하지만 컴파일시 유형의 을 사용합니다. Go(foo)이 있고 foo의 컴파일 타임 형식에 ISpecific이 구현되어 있지 않은 경우 실행시 foo이 나타내는 개체가 ISpecific 인 경우에도 두 번째 메서드가 호출됩니다. 당신이 원하는 경우,이 결정은 실행 시간에 동적으로 만들어 질, 당신은 C# 4를 사용하는 경우, 당신은 쓸 수 :

dynamic value = GetValue(); 
something.Go(value); 

을 ... 그리고 실행 시간에, 올바른 과부하가 선택됩니다.

+0

이 양식의 유용성에 대한 예를 제시 할 수 있습니까? 웃기지 만, 나는 오늘 아침에 분산과 과부하에 대한 블로그 게시물 중 하나를 읽고있었습니다. –

+0

@ Justin : 역동적 인 타이핑의 방식으로 많이하는 경향이 없으므로 확실하지 않습니다 ... 그러나 OP *가 될 수도있는 것처럼 들립니다. –

5

예. 이것이 컴파일러가 작동하는 방법입니다.

3

예 가능합니다. 취할 과부하에 대한 결정은 참조의 컴파일 시간 유형을 기반으로 수행됩니다.

ISpecific specificVar = null; 
something.Go(specificVar); // ISomething::Go(ISpecific) 
object obj = specificVar; 
something.Go(obj); // ISomething::Go(object) 
0

예 확실히 작동하지만 ISpecific이 아닌 개체는 개체 오버로드를 호출합니다.

확인할 콘솔 앱을 작성했습니다.

그것은 작동합니다

Object 
Object 
Specific 

class Program 
{ 
    static void Main() 
    { 
     Object aSpecific = new Object(); 
     String nonSpecific = "nonSpecific"; 
     ISpecific specific = new Specific(); 

     ISomething something = new Something(); 

     something.Go(aSpecific); 
     something.Go(nonSpecific); 
     something.Go(specific); 

     Console.ReadKey(); 
    } 
} 

interface ISpecific 
{ 
    void GoGo(); 
} 

interface ISomething 
{ 
    void Go(ISpecific specific) 
    void Go(Object o) 
} 

Class Specific : ISpecific 
{ 
    public Specific() { } 

    public void GoGo() 
    { 
     Console.WriteLine("Specific"); 
    } 
} 

Class Something : ISomething 
{ 
    public Something() { } 

    public void Go(ISpecific specific) 
    { 
     specific.GoGo() 
    } 

    public void Go(Object o) 
    { 
     Console.WriteLine("Object"); 
    } 
}