아름다운 질문! 매일 C #을 수행하지 않는 사람들을 위해 약간 더 긴 설명을 추가하고 싶습니다. 질문은 일반적으로 이름 확인 문제를 상기시키는 좋은 질문이기 때문입니다.
다음과 같이 약간 수정 된 원본 코드를 가져옵니다.
- 원래 표현식에서와 같이 비교하는 대신 유형 이름을 인쇄 해 봅시다 (예 :
return this is Sparta .
- 인터페이스
Athena를 정의하겠습니다 .Place인터페이스 이름 확인을 설명하기 수퍼 클래스 .
- 모든 것을 매우 명확하게 만들기 위해 클래스에
this바인딩 된 형식 이름을 인쇄 해 보겠습니다 Sparta.
코드는 다음과 같습니다.
public class Place {
public interface Athena { }
}
public class Sparta : Place
{
public void printTypeOfThis()
{
Console.WriteLine (this.GetType().Name);
}
public void printTypeOfSparta()
{
Console.WriteLine (typeof(Sparta));
}
public void printTypeOfAthena()
{
Console.WriteLine (typeof(Athena));
}
}
이제 Sparta개체를 만들고 세 가지 메서드를 호출합니다.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
우리가 얻는 출력은 다음과 같습니다.
Sparta
Athena
Place+Athena
그러나 Place 클래스를 수정하고 Sparta 인터페이스를 정의하면 :
public class Place {
public interface Athena { }
public interface Sparta { }
}
그러면 Sparta이름 조회 메커니즘에서 먼저 사용할 수있는 인터페이스 인 인터페이스 가 다음 과 같이 변경됩니다.
Sparta
Place+Sparta
Place+Athena
그래서 우리는 MakeItReturnFalse이름 확인에 의해 처음 발견되는 슈퍼 클래스에서 Sparta 인터페이스를 정의하는 것만으로 함수 정의 에서 유형 비교를 효과적으로 엉망으로 만들었습니다.
그러나 C #은 이름 확인에서 슈퍼 클래스에 정의 된 인터페이스의 우선 순위를 지정하는 이유는 무엇입니까? @JonSkeet 알고 있습니다! 그의 답변을 읽으면 C #의 이름 확인 프로토콜에 대한 세부 정보를 얻을 수 있습니다.