基于几天前在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重要的方法无关。您还可以GetType使用new修饰符关键字制作一个隐藏相关方法的公共实例方法。请注意,如果您有一个类似的通用方法static Type Test<T>(T t) { return t.GetType(); }(对,没有任何限制T),那么诸如此类的东西Test<IFoo>(new BadFoo())仍将调用原始GetType方法。