며칠 전 SO : GetType () 및 다형성 과 Eric Lippert의 답변을 읽은 다음 질문을 기반으로 GetType()가상이 아닌 것이 실제로 객체가 Type.
특히 Eric의 대답은 다음과 같습니다.
프레임 워크 디자이너는 동일한 유형의 다른 세 가지 메서드와 일관성을 유지하기 위해 객체가 해당 유형에 대해 거짓말을하도록 허용하는 등 엄청나게 위험한 기능을 추가하지 않을 것입니다.
이제 질문은 : 나는 개체 수 않습니다 즉시 분명하지 않고 그 형태에 대해 거짓말을? 나는 여기서 완전히 틀렸을 수 있으며 그럴 경우 명확하게 설명하고 싶지만 다음 코드를 고려하십시오.
public interface IFoo
{
Type GetType();
}
그리고 상기 인터페이스의 다음 두 가지 구현 :
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
그런 다음 다음과 같은 간단한 프로그램을 실행하면 :
static void Main(string[] args)
{
IFoo badFoo = new BadFoo();
IFoo niceFoo = new NiceFoo();
Console.WriteLine("BadFoo says he's a '{0}'", badFoo.GetType().ToString());
Console.WriteLine("NiceFoo says he's a '{0}'", niceFoo.GetType().ToString());
Console.ReadLine();
}
확실히 충분히 badFoo잘못된 Type.
이제이 행동이 " 매우 위험한 기능 " 이라고 설명하는 Eric을 기반으로 한 심각한 의미가 있는지 모르겠지만 이 패턴이 신뢰할 수있는 위협이 될 수 있습니까?
IFoo.GetType그리고 object.GetType똑같은 것이 아니기 때문에 나쁜 스타일을 제외하고는 여기서 나쁜 일이 일어나지 않습니다. 편집 : 일반적으로 GetType컴파일 타임에 알려지지 않은 일부 개체에서 호출됩니다. 대부분의 경우 object일부 이상한 인터페이스가 아닙니다. :)
GetType합니다. 그것은 GetType중요한 방법 과 관련이 없습니다 . modifier 키워드를 GetType사용하여 관련 메서드 를 숨기는 공용 인스턴스 메서드를 만들 수도 있습니다 new. static Type Test<T>(T t) { return t.GetType(); }(에 대한 제약없이 T) 와 같은 일반 메서드가있는 경우 같은 항목 Test<IFoo>(new BadFoo())은 여전히 원래 GetType메서드를 호출합니다 .