은 가능 어떻게 든 다음과 같은 방식을 구현하는 것입니다 구현에 Go(Object)
?C# 과부하 문제
답변
이렇게하면 기본적으로 작동하지만 컴파일시 유형의 을 사용합니다. Go(foo)
이 있고 foo
의 컴파일 타임 형식에 ISpecific
이 구현되어 있지 않은 경우 실행시 foo
이 나타내는 개체가 ISpecific
인 경우에도 두 번째 메서드가 호출됩니다. 당신이 원하는 경우,이 결정은 실행 시간에 동적으로 만들어 질, 당신은 C# 4를 사용하는 경우, 당신은 쓸 수 :
dynamic value = GetValue();
something.Go(value);
을 ... 그리고 실행 시간에, 올바른 과부하가 선택됩니다.
이 양식의 유용성에 대한 예를 제시 할 수 있습니까? 웃기지 만, 나는 오늘 아침에 분산과 과부하에 대한 블로그 게시물 중 하나를 읽고있었습니다. –
@ Justin : 역동적 인 타이핑의 방식으로 많이하는 경향이 없으므로 확실하지 않습니다 ... 그러나 OP *가 될 수도있는 것처럼 들립니다. –
예. 이것이 컴파일러가 작동하는 방법입니다.
예 가능합니다. 취할 과부하에 대한 결정은 참조의 컴파일 시간 유형을 기반으로 수행됩니다.
ISpecific specificVar = null;
something.Go(specificVar); // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj); // ISomething::Go(object)
예 확실히 작동하지만 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");
}
}
출력합니다. 컴파일러에서 간단한 예제를 시도했을 때 무엇을 발견 했습니까? – taylonr